mirror of
https://github.com/fluxcd/flagger.git
synced 2026-04-15 06:57:34 +00:00
add e2e tests istio
add e2e tests istio clean up comment from review add e2e tests istio clean up comment from review clean up logging statement add e2e tests istio clean up comment from review clean up logging statement add log statement on e2e iteration add e2e tests istio clean up comment from review clean up logging statement add log statement on e2e iteration extend timeout for finalizing add e2e tests istio clean up comment from review clean up logging statement add log statement on e2e iteration extend timeout for finalizing add phase to kustomize crd add e2e tests istio clean up comment from review clean up logging statement add log statement on e2e iteration extend timeout for finalizing add phase to kustomize crd revert timeout on circleci vs and svc checks for istio e2e tests fix fmt errors and tests add get statement in e2e test add get statement in e2e test add namespace to e2e use only selector for service revert
This commit is contained in:
@@ -653,6 +653,8 @@ spec:
|
||||
- Finalising
|
||||
- Succeeded
|
||||
- Failed
|
||||
- Terminating
|
||||
- Terminated
|
||||
canaryWeight:
|
||||
description: Traffic weight percentage routed to canary
|
||||
type: number
|
||||
|
||||
@@ -302,7 +302,7 @@ type CanaryWebhook struct {
|
||||
URL string `json:"url"`
|
||||
|
||||
// Request timeout for this webhook
|
||||
Timeout string `json:"timeout"`
|
||||
Timeout string `json:"timeout,omitempty"`
|
||||
|
||||
// Metadata (key-value pairs) for this webhook
|
||||
// +optional
|
||||
|
||||
@@ -398,7 +398,7 @@ func (c *DeploymentController) HaveDependenciesChanged(cd *flaggerv1.Canary) (bo
|
||||
return c.configTracker.HasConfigChanged(cd)
|
||||
}
|
||||
|
||||
// revertDeployment will set the replica count from the primary to the reference instance. This method is used
|
||||
// Finalize will set the replica count from the primary to the reference instance. This method is used
|
||||
// during a delete to attempt to revert the deployment back to the original state. Error is returned if unable
|
||||
// update the reference deployment replicas to the primary replicas
|
||||
func (c *DeploymentController) Finalize(cd *flaggerv1.Canary) error {
|
||||
|
||||
@@ -140,7 +140,7 @@ func NewController(
|
||||
ctrl.logger.Infof("%s.%s opting out, deleting finalizers", newCanary.Name, newCanary.Namespace)
|
||||
err := ctrl.removeFinalizer(&newCanary, finalizer)
|
||||
if err != nil {
|
||||
ctrl.logger.Warnf("Failed to finalizers for %s.%s", oldCanary.Name, oldCanary.Namespace)
|
||||
ctrl.logger.Warnf("Failed to remove finalizers for %s.%s", oldCanary.Name, oldCanary.Namespace)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
@@ -43,7 +43,7 @@ func (c *Controller) finalize(old interface{}) error {
|
||||
c.logger.Warnf("%s.%s failed due to %s not found", r.Name, r.Namespace, r.Spec.TargetRef.Kind)
|
||||
return nil
|
||||
}
|
||||
c.logger.Errorf("%s.%s failed due to %s", r.Name, r.Namespace, err)
|
||||
c.logger.Debugf("%s.%s failed due to %s", r.Name, r.Namespace, err)
|
||||
return err
|
||||
} else {
|
||||
//Ensure that targetRef has met a ready state
|
||||
@@ -163,7 +163,8 @@ func (c *Controller) addFinalizer(canary *flaggerv1.Canary, finalizerString stri
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
return ex.Wrap(err, "Remove finalizer failed")
|
||||
c.logger.Errorf("Failed to add finalizer %s", err)
|
||||
return ex.Wrap(err, "Add finalizer failed")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@ import (
|
||||
|
||||
flaggerv1 "github.com/weaveworks/flagger/pkg/apis/flagger/v1beta1"
|
||||
fakeFlagger "github.com/weaveworks/flagger/pkg/client/clientset/versioned/fake"
|
||||
"github.com/weaveworks/flagger/pkg/logger"
|
||||
"k8s.io/apimachinery/pkg/runtime"
|
||||
k8sTesting "k8s.io/client-go/testing"
|
||||
|
||||
@@ -41,10 +42,16 @@ func TestFinalizer_addFinalizer(t *testing.T) {
|
||||
cs.PrependReactor("update", "canaries", func(action k8sTesting.Action) (handled bool, ret runtime.Object, err error) {
|
||||
return true, nil, mockError
|
||||
})
|
||||
|
||||
logger, _ := logger.NewLogger("debug")
|
||||
m := fixture{
|
||||
canary: newDeploymentTestCanary(),
|
||||
flaggerClient: cs,
|
||||
ctrl: &Controller{flaggerClient: cs},
|
||||
ctrl: &Controller{
|
||||
flaggerClient: cs,
|
||||
logger: logger,
|
||||
},
|
||||
logger: logger,
|
||||
}
|
||||
|
||||
tables := []struct {
|
||||
|
||||
+1
-1
@@ -214,7 +214,7 @@ func (ir *IstioRouter) reconcileVirtualService(canary *flaggerv1.Canary) error {
|
||||
|
||||
//If annotation kubectl.kubernetes.io/last-applied-configuration is present no need to duplicate
|
||||
//serialization. If not present store the serialized object in annotation
|
||||
//flagger.kubernetes.io/original-configuration
|
||||
//flagger.kubernetes.app/original-configuration
|
||||
if _, ok := vtClone.Annotations[kubectlAnnotation]; !ok {
|
||||
b, err := json.Marshal(virtualService.Spec)
|
||||
if err != nil {
|
||||
|
||||
@@ -184,7 +184,7 @@ func (c *KubernetesDefaultRouter) Finalize(canary *flaggerv1.Canary) error {
|
||||
svc.Name, svc.Namespace, kubectlAnnotation)
|
||||
}
|
||||
clone := svc.DeepCopy()
|
||||
clone.Spec = storedSvc.Spec
|
||||
clone.Spec.Selector = storedSvc.Spec.Selector
|
||||
|
||||
_, err = c.kubeClient.CoreV1().Services(canary.Namespace).Update(clone)
|
||||
if err != nil {
|
||||
|
||||
@@ -328,6 +328,237 @@ done
|
||||
|
||||
echo '✔ A/B testing promotion test passed'
|
||||
|
||||
cat <<EOF | kubectl apply -f -
|
||||
apiVersion: flagger.app/v1beta1
|
||||
kind: Canary
|
||||
metadata:
|
||||
name: podinfo
|
||||
namespace: test
|
||||
spec:
|
||||
revertOnDeletion: true
|
||||
targetRef:
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
name: podinfo
|
||||
progressDeadlineSeconds: 60
|
||||
service:
|
||||
portDiscovery: true
|
||||
port: 80
|
||||
portName: http-podinfo
|
||||
targetPort: http
|
||||
analysis:
|
||||
interval: 10s
|
||||
threshold: 5
|
||||
iterations: 5
|
||||
match:
|
||||
- headers:
|
||||
cookie:
|
||||
regex: "^(.*?;)?(type=insider)(;.*)?$"
|
||||
metrics:
|
||||
- name: request-success-rate
|
||||
thresholdRange:
|
||||
min: 99
|
||||
interval: 1m
|
||||
- name: latency
|
||||
templateRef:
|
||||
name: latency
|
||||
namespace: istio-system
|
||||
thresholdRange:
|
||||
max: 500
|
||||
interval: 30s
|
||||
webhooks:
|
||||
- name: pre
|
||||
type: pre-rollout
|
||||
url: http://flagger-loadtester.test/
|
||||
timeout: 5s
|
||||
metadata:
|
||||
type: cmd
|
||||
cmd: "hey -z 10m -q 10 -c 2 -H 'Cookie: type=insider' http://podinfo-canary.test/"
|
||||
logCmdOutput: "true"
|
||||
- name: promote-gate
|
||||
type: confirm-promotion
|
||||
url: http://flagger-loadtester.test/gate/approve
|
||||
- name: post
|
||||
type: post-rollout
|
||||
url: http://flagger-loadtester.test/
|
||||
timeout: 15s
|
||||
metadata:
|
||||
type: cmd
|
||||
cmd: "curl -s http://podinfo.test/"
|
||||
logCmdOutput: "true"
|
||||
EOF
|
||||
|
||||
echo '>>> Waiting for finalizers to be present'
|
||||
retries=50
|
||||
count=0
|
||||
ok=false
|
||||
until ${ok}; do
|
||||
kubectl get canary podinfo -n test -o jsonpath='{.metadata.finalizers}' | grep "finalizer.flagger.app" && ok=true || ok=false
|
||||
sleep 10
|
||||
count=$(($count + 1))
|
||||
if [[ ${count} -eq ${retries} ]]; then
|
||||
kubectl -n test describe canary/podinfo
|
||||
echo "No more retries left"
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
|
||||
kubectl delete canary podinfo -n test
|
||||
|
||||
echo '>>> Waiting for primary to revert'
|
||||
retries=50
|
||||
count=0
|
||||
ok=false
|
||||
until ${ok}; do
|
||||
kubectl get deployment podinfo -n test -o jsonpath='{.spec.replicas}' | grep 1 && ok=true || ok=false
|
||||
sleep 10
|
||||
kubectl -n istio-system logs deployment/flagger --tail 10
|
||||
count=$(($count + 1))
|
||||
if [[ ${count} -eq ${retries} ]]; then
|
||||
kubectl -n test describe canary/podinfo
|
||||
echo "No more retries left"
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
echo '✔ Delete testing passed'
|
||||
|
||||
|
||||
|
||||
cat <<EOF | kubectl apply -f -
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
labels:
|
||||
app: podinfo
|
||||
name: podinfo
|
||||
namespace: test
|
||||
spec:
|
||||
ports:
|
||||
- name: http
|
||||
port: 9898
|
||||
protocol: TCP
|
||||
targetPort: http
|
||||
selector:
|
||||
app: podinfo
|
||||
type: ClusterIP
|
||||
---
|
||||
apiVersion: networking.istio.io/v1alpha3
|
||||
kind: VirtualService
|
||||
metadata:
|
||||
name: podinfo
|
||||
namespace: test
|
||||
spec:
|
||||
gateways:
|
||||
- ingressgateway.istio-system.svc.cluster.local
|
||||
hosts:
|
||||
- app.example.com
|
||||
- podinfo
|
||||
http:
|
||||
- retries:
|
||||
attempts: 3
|
||||
perTryTimeout: 1s
|
||||
retryOn: gateway-error,connect-failure,refused-stream
|
||||
route:
|
||||
- destination:
|
||||
host: podinfo
|
||||
---
|
||||
apiVersion: flagger.app/v1beta1
|
||||
kind: Canary
|
||||
metadata:
|
||||
name: podinfo
|
||||
namespace: test
|
||||
spec:
|
||||
revertOnDeletion: true
|
||||
targetRef:
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
name: podinfo
|
||||
progressDeadlineSeconds: 60
|
||||
service:
|
||||
portDiscovery: true
|
||||
port: 80
|
||||
portName: http-podinfo
|
||||
targetPort: http
|
||||
analysis:
|
||||
interval: 10s
|
||||
threshold: 5
|
||||
iterations: 5
|
||||
match:
|
||||
- headers:
|
||||
cookie:
|
||||
regex: "^(.*?;)?(type=insider)(;.*)?$"
|
||||
metrics:
|
||||
- name: request-success-rate
|
||||
thresholdRange:
|
||||
min: 99
|
||||
interval: 1m
|
||||
- name: latency
|
||||
templateRef:
|
||||
name: latency
|
||||
namespace: istio-system
|
||||
thresholdRange:
|
||||
max: 500
|
||||
interval: 30s
|
||||
webhooks:
|
||||
- name: pre
|
||||
type: pre-rollout
|
||||
url: http://flagger-loadtester.test/
|
||||
timeout: 5s
|
||||
metadata:
|
||||
type: cmd
|
||||
cmd: "hey -z 10m -q 10 -c 2 -H 'Cookie: type=insider' http://podinfo-canary.test/"
|
||||
logCmdOutput: "true"
|
||||
- name: promote-gate
|
||||
type: confirm-promotion
|
||||
url: http://flagger-loadtester.test/gate/approve
|
||||
- name: post
|
||||
type: post-rollout
|
||||
url: http://flagger-loadtester.test/
|
||||
timeout: 15s
|
||||
metadata:
|
||||
type: cmd
|
||||
cmd: "curl -s http://podinfo.test/"
|
||||
logCmdOutput: "true"
|
||||
|
||||
EOF
|
||||
|
||||
echo '>>> Waiting for canary to initialize'
|
||||
retries=50
|
||||
count=0
|
||||
ok=false
|
||||
until ${ok}; do
|
||||
kubectl -n test get canary/podinfo | grep 'Initialized' && ok=true || ok=false
|
||||
sleep 5
|
||||
count=$(($count + 1))
|
||||
if [[ ${count} -eq ${retries} ]]; then
|
||||
kubectl -n istio-system logs deployment/flagger
|
||||
echo "No more retries left"
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
|
||||
kubectl delete canary podinfo -n test
|
||||
|
||||
echo '>>> Waiting for revert'
|
||||
retries=50
|
||||
count=0
|
||||
ok=false
|
||||
until ${ok}; do
|
||||
kubectl get svc/podinfo vs/podinfo -n test -o jsonpath="{range .items[*]}{.metadata.name}{'\n'}{end}" | wc -l | grep 2 && ok=true || ok=false
|
||||
sleep 10
|
||||
kubectl -n istio-system logs deployment/flagger --tail 10
|
||||
count=$(($count + 1))
|
||||
if [[ ${count} -eq ${retries} ]]; then
|
||||
kubectl -n test describe canary/podinfo
|
||||
kubectl -n test describe svc/podinfo
|
||||
kubectl -n test describe vs/podinfo
|
||||
echo "No more retries left"
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
echo '✔ Revert testing passed'
|
||||
|
||||
|
||||
kubectl -n istio-system logs deployment/flagger
|
||||
|
||||
echo '✔ All tests passed'
|
||||
|
||||
Reference in New Issue
Block a user