Skip to content

Commit 05e9425

Browse files
committed
Introducing a Blue/Green State Machine
1 parent ee47067 commit 05e9425

17 files changed

+877
-608
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one or more
3+
* contributor license agreements. See the NOTICE file distributed with
4+
* this work for additional information regarding copyright ownership.
5+
* The ASF licenses this file to You under the Apache License, Version 2.0
6+
* (the "License"); you may not use this file except in compliance with
7+
* the License. You may obtain a copy of the License at
8+
*
9+
* http://www.apache.org/licenses/LICENSE-2.0
10+
*
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
*/
17+
18+
package org.apache.flink.kubernetes.operator.api.bluegreen;
19+
20+
/** Enum representing different types of differences in Blue/Green deployment specifications. */
21+
public enum BlueGreenDiffType {
22+
/** No changes detected, should be ignored. */
23+
IGNORE,
24+
25+
/** Changes that require a Blue/Green transition. */
26+
TRANSITION,
27+
28+
/** Changes that only affect the top-level configuration. */
29+
PATCH_TOP_LEVEL,
30+
31+
/** Changes that only affect the child FlinkDeploymentSpec. */
32+
PATCH_CHILD,
33+
34+
/** Changes that affect both top-level and child specifications. */
35+
PATCH_BOTH
36+
}

flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/controller/BlueGreenStateMachine.java

Lines changed: 0 additions & 386 deletions
This file was deleted.

flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/controller/FlinkBlueGreenDeploymentController.java

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,12 @@
1919

2020
import org.apache.flink.kubernetes.operator.api.FlinkBlueGreenDeployment;
2121
import org.apache.flink.kubernetes.operator.api.FlinkDeployment;
22+
import org.apache.flink.kubernetes.operator.api.status.FlinkBlueGreenDeploymentState;
2223
import org.apache.flink.kubernetes.operator.api.status.FlinkBlueGreenDeploymentStatus;
23-
import org.apache.flink.kubernetes.operator.controller.BlueGreenStateMachine.BlueGreenTransitionContext;
24+
import org.apache.flink.kubernetes.operator.controller.bluegreen.BlueGreenStateHandlerRegistry;
25+
import org.apache.flink.kubernetes.operator.controller.bluegreen.BlueGreenContext;
26+
import org.apache.flink.kubernetes.operator.controller.bluegreen.handlers.BlueGreenStateHandler;
27+
import org.apache.flink.kubernetes.operator.controller.bluegreen.BlueGreenDeploymentService;
2428
import org.apache.flink.kubernetes.operator.service.FlinkResourceContextFactory;
2529

2630
import io.javaoperatorsdk.operator.api.config.informer.InformerEventSourceConfiguration;
@@ -48,13 +52,13 @@ public class FlinkBlueGreenDeploymentController implements Reconciler<FlinkBlueG
4852
private static final Logger LOG = LoggerFactory.getLogger(FlinkDeploymentController.class);
4953

5054
private final FlinkResourceContextFactory ctxFactory;
51-
private final BlueGreenStateMachine stateMachine;
55+
private final BlueGreenStateHandlerRegistry handlerRegistry;
5256

5357
public static long minimumAbortGracePeriodMs = ABORT_GRACE_PERIOD.defaultValue().toMillis();
5458

5559
public FlinkBlueGreenDeploymentController(FlinkResourceContextFactory ctxFactory) {
5660
this.ctxFactory = ctxFactory;
57-
this.stateMachine = new BlueGreenStateMachine();
61+
this.handlerRegistry = new BlueGreenStateHandlerRegistry();
5862
}
5963

6064
@Override
@@ -85,27 +89,36 @@ public UpdateControl<FlinkBlueGreenDeployment> reconcile(
8589

8690
if (deploymentStatus == null) {
8791
var context =
88-
new BlueGreenTransitionContext(
92+
new BlueGreenContext(
8993
bgDeployment,
9094
new FlinkBlueGreenDeploymentStatus(),
9195
josdkContext,
9296
null,
9397
ctxFactory);
94-
return stateMachine
98+
return BlueGreenDeploymentService
9599
.patchStatusUpdateControl(context, INITIALIZING_BLUE, null)
96100
.rescheduleAfter(100);
97101
} else {
102+
FlinkBlueGreenDeploymentState currentState = deploymentStatus.getBlueGreenState();
98103
var context =
99-
new BlueGreenTransitionContext(
104+
new BlueGreenContext(
100105
bgDeployment,
101106
deploymentStatus,
102107
josdkContext,
103-
deploymentStatus.getBlueGreenState() == INITIALIZING_BLUE
108+
currentState == INITIALIZING_BLUE
104109
? null
105110
: FlinkBlueGreenDeployments.fromSecondaryResources(
106111
josdkContext),
107112
ctxFactory);
108-
return stateMachine.processState(context);
113+
114+
LOG.debug(
115+
"Processing state: {} for deployment: {}",
116+
currentState,
117+
context.getDeploymentName());
118+
119+
BlueGreenStateHandler handler = handlerRegistry.getHandler(currentState);
120+
return handler.handle(context);
121+
// return stateMachine.processState(context);
109122
}
110123
}
111124

flink-kubernetes-operator/src/main/java/org/apache/flink/kubernetes/operator/controller/FlinkBlueGreenDeploymentUtils.java

Lines changed: 0 additions & 154 deletions
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package org.apache.flink.kubernetes.operator.controller.bluegreen;
2+
3+
import io.javaoperatorsdk.operator.api.reconciler.Context;
4+
import lombok.Getter;
5+
import lombok.RequiredArgsConstructor;
6+
import org.apache.flink.kubernetes.operator.api.FlinkBlueGreenDeployment;
7+
import org.apache.flink.kubernetes.operator.api.FlinkDeployment;
8+
import org.apache.flink.kubernetes.operator.api.bluegreen.DeploymentType;
9+
import org.apache.flink.kubernetes.operator.api.status.FlinkBlueGreenDeploymentStatus;
10+
import org.apache.flink.kubernetes.operator.controller.FlinkBlueGreenDeployments;
11+
import org.apache.flink.kubernetes.operator.service.FlinkResourceContextFactory;
12+
13+
/**
14+
* Simplified context object containing all the necessary state and dependencies for Blue/Green
15+
* deployment state transitions.
16+
*/
17+
@Getter
18+
@RequiredArgsConstructor
19+
public class BlueGreenContext {
20+
private final FlinkBlueGreenDeployment bgDeployment;
21+
private final FlinkBlueGreenDeploymentStatus deploymentStatus;
22+
private final Context<FlinkBlueGreenDeployment> josdkContext;
23+
private final FlinkBlueGreenDeployments deployments;
24+
private final FlinkResourceContextFactory ctxFactory;
25+
26+
public String getDeploymentName() {
27+
return bgDeployment.getMetadata().getName();
28+
}
29+
30+
public FlinkDeployment getBlueDeployment() {
31+
return deployments != null ? deployments.getFlinkDeploymentBlue() : null;
32+
}
33+
34+
public FlinkDeployment getGreenDeployment() {
35+
return deployments != null ? deployments.getFlinkDeploymentGreen() : null;
36+
}
37+
38+
public FlinkDeployment getDeploymentByType(DeploymentType type) {
39+
return type == DeploymentType.BLUE ? getBlueDeployment() : getGreenDeployment();
40+
}
41+
}

0 commit comments

Comments
 (0)