Skip to content

Commit

Permalink
rollouts: add AllAtOnce strategy (kptdev#3703)
Browse files Browse the repository at this point in the history
  • Loading branch information
droot committed Jan 24, 2023
1 parent 9f66602 commit 8ce96af
Show file tree
Hide file tree
Showing 5 changed files with 605 additions and 35 deletions.
44 changes: 44 additions & 0 deletions rollouts/api/v1alpha1/rollout_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@ type RolloutSpec struct {

// PackageToTargetMatcher specifies the clusters that will receive a specific package.
PackageToTargetMatcher PackageToClusterMatcher `json:"packageToTargetMatcher"`
// Strategy specifies the rollout strategy to use for this rollout.
Strategy RolloutStrategy `json:"strategy"`
}

type ClusterTargetSelector struct {
Expand Down Expand Up @@ -88,10 +90,52 @@ type PackageToClusterMatcher struct {
MatchExpression string `json:"matchExpression"`
}

// +kubebuilder:validation:Enum=AllAtOnce;Rolling;Progressive
type StrategyType string

const (
AllAtOnce StrategyType = "AllAtOnce"
Rolling StrategyType = "Rolling"
Progressive StrategyType = "Progressive"
)

type StrategyAllAtOnce struct{}

type StrategyRolling struct {
MaxUnavailable int64 `json:"maxUnavailable"`
}

// StrategyProgressive allows staged rollouts
// where the entire rollout will progress through different stages (aka steps, phases or waves).
type StrategyProgressive struct{}

type RolloutStrategy struct {
Type StrategyType `json:"type"`
AllAtOnce *StrategyAllAtOnce `json:"allAtOnce,omitempty"`
Rolling *StrategyRolling `json:"rolling,omitempty"`
Progressive *StrategyProgressive `json:"progressive,omitempty"`
}

// RolloutStatus defines the observed state of Rollout
type RolloutStatus struct {
// INSERT ADDITIONAL STATUS FIELD - define observed state of cluster
// Important: Run "make" to regenerate code after modifying this file
ObservedGeneration int64 `json:"observedGeneration,omitempty"`

// Conditions describes the reconciliation state of the object.
Conditions []metav1.Condition `json:"conditions,omitempty"`

ClusterStatuses []ClusterStatus `json:"clusterStatuses,omitempty"`
}

type ClusterStatus struct {
Name string `json:"name"`
PackageStatus PackageStatus `json:"packageStatus"`
}

type PackageStatus struct {
PackageID string `json:"packageId"`
SyncStatus string `json:"syncStatus"`
}

//+kubebuilder:object:root=true
Expand Down
121 changes: 120 additions & 1 deletion rollouts/api/v1alpha1/zz_generated.deepcopy.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

126 changes: 126 additions & 0 deletions rollouts/config/crd/bases/gitops.kpt.dev_rollouts.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,34 @@ spec:
- git
- sourceType
type: object
strategy:
description: Strategy specifies the rollout strategy to use for this
rollout.
properties:
allAtOnce:
type: object
progressive:
description: StrategyProgressive allows staged rollouts where
the entire rollout will progress through different stages (aka
steps, phases or waves).
type: object
rolling:
properties:
maxUnavailable:
format: int64
type: integer
required:
- maxUnavailable
type: object
type:
enum:
- AllAtOnce
- Rolling
- Progressive
type: string
required:
- type
type: object
targets:
description: Targets specifies the clusters that will receive the
KRM config packages.
Expand Down Expand Up @@ -151,9 +179,107 @@ spec:
required:
- packageToTargetMatcher
- packages
- strategy
type: object
status:
description: RolloutStatus defines the observed state of Rollout
properties:
clusterStatuses:
items:
properties:
name:
type: string
packageStatus:
properties:
packageId:
type: string
syncStatus:
type: string
required:
- packageId
- syncStatus
type: object
required:
- name
- packageStatus
type: object
type: array
conditions:
description: Conditions describes the reconciliation state of the
object.
items:
description: "Condition contains details for one aspect of the current
state of this API Resource. --- This struct is intended for direct
use as an array at the field path .status.conditions. For example,
\n type FooStatus struct{ // Represents the observations of a
foo's current state. // Known .status.conditions.type are: \"Available\",
\"Progressing\", and \"Degraded\" // +patchMergeKey=type // +patchStrategy=merge
// +listType=map // +listMapKey=type Conditions []metav1.Condition
`json:\"conditions,omitempty\" patchStrategy:\"merge\" patchMergeKey:\"type\"
protobuf:\"bytes,1,rep,name=conditions\"` \n // other fields }"
properties:
lastTransitionTime:
description: lastTransitionTime is the 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: message is a human readable message indicating
details about the transition. This may be an empty string.
maxLength: 32768
type: string
observedGeneration:
description: observedGeneration represents the .metadata.generation
that the condition was set based upon. For instance, if .metadata.generation
is currently 12, but the .status.conditions[x].observedGeneration
is 9, the condition is out of date with respect to the current
state of the instance.
format: int64
minimum: 0
type: integer
reason:
description: reason contains a programmatic identifier indicating
the reason for the condition's last transition. Producers
of specific condition types may define expected values and
meanings for this field, and whether the values are considered
a guaranteed API. The value should be a CamelCase string.
This field may not be empty.
maxLength: 1024
minLength: 1
pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$
type: string
status:
description: status of the condition, one of True, False, Unknown.
enum:
- "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. The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt)
maxLength: 316
pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$
type: string
required:
- lastTransitionTime
- message
- reason
- status
- type
type: object
type: array
observedGeneration:
description: 'INSERT ADDITIONAL STATUS FIELD - define observed state
of cluster Important: Run "make" to regenerate code after modifying
this file'
format: int64
type: integer
type: object
type: object
served: true
Expand Down
18 changes: 11 additions & 7 deletions rollouts/config/samples/gitops_v1alpha1_rollout.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -28,14 +28,18 @@ spec:
sourceType: git
git:
selector:
org: GoogleContainerTools
repo: kpt-samples
directory: "*"
org: droot
repo: oahu
directory: namespaces
revision: main
targets:
selector:
matchExpressions:
- {key: location/island, operator: In, values: [oahu, maui]}
packageToTargetMatcher:
type: CEL
matchExpression: 'true'
targets:
selector:
matchLabels:
env: staging
# matchExpressions:
# - {key: env, operator: In, values: [dev, staging]}
strategy:
type: AllAtOnce
Loading

0 comments on commit 8ce96af

Please sign in to comment.