add lua scripts for istio (#178)
* add lua scripts for istio Signed-off-by: Kuromesi <blackfacepan@163.com> * make some improvements for istio lua script Signed-off-by: Kuromesi <blackfacepan@163.com> --------- Signed-off-by: Kuromesi <blackfacepan@163.com>
This commit is contained in:
parent
d41b1fa7d7
commit
07b7f20f6a
|
@ -138,7 +138,7 @@ func objectToTable(path string) error {
|
|||
return fmt.Errorf("failed to open file: %s", err)
|
||||
}
|
||||
defer fileStream.Close()
|
||||
header := "-- THIS IS GENERATED BY LUA.GO FOR DEBUGGING --\n"
|
||||
header := "-- THIS IS GENERATED BY CONVERT_TEST_CASE_TO_LUA_OBJECT.GO FOR DEBUGGING --\n"
|
||||
_, err = io.WriteString(fileStream, header+objStr)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to WriteString %s", err)
|
||||
|
|
49
lua_configuration/networking.istio.io/DestinationRule/testdata/traffic_routing_with_a_match.yaml
vendored
Normal file
49
lua_configuration/networking.istio.io/DestinationRule/testdata/traffic_routing_with_a_match.yaml
vendored
Normal file
|
@ -0,0 +1,49 @@
|
|||
trafficRouting:
|
||||
apiVersion: rollouts.kruise.io/v1alpha1
|
||||
kind: TrafficRouting
|
||||
metadata:
|
||||
name: tr-demo
|
||||
spec:
|
||||
strategy:
|
||||
matches:
|
||||
- headers:
|
||||
- type: Exact
|
||||
name: version
|
||||
value: canary
|
||||
objectRef:
|
||||
- service: svc-demo
|
||||
customNetworkRefs:
|
||||
- apiVersion: networking.istio.io/v1beta1
|
||||
kind: DestinationRule
|
||||
name: ds-demo
|
||||
original:
|
||||
apiVersion: networking.istio.io/v1beta1
|
||||
kind: DestinationRule
|
||||
metadata:
|
||||
name: ds-demo
|
||||
spec:
|
||||
host: svc-demo
|
||||
trafficPolicy:
|
||||
loadBalancer:
|
||||
simple: ROUND_ROBIN
|
||||
subsets:
|
||||
- labels:
|
||||
version: base
|
||||
name: version-base
|
||||
expected:
|
||||
- apiVersion: networking.istio.io/v1beta1
|
||||
kind: DestinationRule
|
||||
metadata:
|
||||
name: ds-demo
|
||||
spec:
|
||||
host: svc-demo
|
||||
trafficPolicy:
|
||||
loadBalancer:
|
||||
simple: ROUND_ROBIN
|
||||
subsets:
|
||||
- labels:
|
||||
version: base
|
||||
name: version-base
|
||||
- labels:
|
||||
istio.service.tag: gray
|
||||
name: canary
|
|
@ -0,0 +1,8 @@
|
|||
local spec = obj.data.spec
|
||||
local canary = {}
|
||||
canary.labels = {}
|
||||
canary.name = "canary"
|
||||
local podLabelKey = "istio.service.tag"
|
||||
canary.labels[podLabelKey] = "gray"
|
||||
table.insert(spec.subsets, canary)
|
||||
return obj.data
|
122
lua_configuration/networking.istio.io/VirtualService/testdata/rollout_with_three_steps.yaml
vendored
Normal file
122
lua_configuration/networking.istio.io/VirtualService/testdata/rollout_with_three_steps.yaml
vendored
Normal file
|
@ -0,0 +1,122 @@
|
|||
rollout:
|
||||
apiVersion: rollouts.kruise.io/v1alpha1
|
||||
kind: Rollout
|
||||
metadata:
|
||||
name: rollouts-demo
|
||||
annotations:
|
||||
rollouts.kruise.io/rolling-style: canary
|
||||
spec:
|
||||
disabled: false
|
||||
objectRef:
|
||||
workloadRef:
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
name: deploy-demo
|
||||
strategy:
|
||||
canary:
|
||||
steps:
|
||||
- matches:
|
||||
- headers:
|
||||
- type: Exact
|
||||
name: user-agent
|
||||
value: pc
|
||||
- type: RegularExpression
|
||||
name: name
|
||||
value: ".*demo"
|
||||
- matches:
|
||||
- headers:
|
||||
- type: Exact
|
||||
name: user-agent
|
||||
value: pc
|
||||
- headers:
|
||||
- type: RegularExpression
|
||||
name: name
|
||||
value: ".*demo"
|
||||
- weight: 50
|
||||
trafficRoutings:
|
||||
- service: svc-demo
|
||||
customNetworkRefs:
|
||||
- apiVersion: networking.istio.io/v1alpha3
|
||||
kind: VirtualService
|
||||
name: vs-demo
|
||||
original:
|
||||
apiVersion: networking.istio.io/v1alpha3
|
||||
kind: VirtualService
|
||||
metadata:
|
||||
name: vs-demo
|
||||
spec:
|
||||
hosts:
|
||||
- "*"
|
||||
gateways:
|
||||
- nginx-gateway
|
||||
http:
|
||||
- route:
|
||||
- destination:
|
||||
host: svc-demo
|
||||
expected:
|
||||
- apiVersion: networking.istio.io/v1alpha3
|
||||
kind: VirtualService
|
||||
metadata:
|
||||
name: vs-demo
|
||||
spec:
|
||||
hosts:
|
||||
- "*"
|
||||
gateways:
|
||||
- nginx-gateway
|
||||
http:
|
||||
- match:
|
||||
- headers:
|
||||
user-agent:
|
||||
exact: pc
|
||||
name:
|
||||
regex: .*demo
|
||||
route:
|
||||
- destination:
|
||||
host: svc-demo-canary
|
||||
- route:
|
||||
- destination:
|
||||
host: svc-demo
|
||||
- apiVersion: networking.istio.io/v1alpha3
|
||||
kind: VirtualService
|
||||
metadata:
|
||||
name: vs-demo
|
||||
spec:
|
||||
hosts:
|
||||
- "*"
|
||||
gateways:
|
||||
- nginx-gateway
|
||||
http:
|
||||
- match:
|
||||
- headers:
|
||||
name:
|
||||
regex: .*demo
|
||||
route:
|
||||
- destination:
|
||||
host: svc-demo-canary
|
||||
- match:
|
||||
- headers:
|
||||
user-agent:
|
||||
exact: pc
|
||||
route:
|
||||
- destination:
|
||||
host: svc-demo-canary
|
||||
- route:
|
||||
- destination:
|
||||
host: svc-demo
|
||||
- apiVersion: networking.istio.io/v1alpha3
|
||||
kind: VirtualService
|
||||
metadata:
|
||||
name: vs-demo
|
||||
spec:
|
||||
hosts:
|
||||
- "*"
|
||||
gateways:
|
||||
- nginx-gateway
|
||||
http:
|
||||
- route:
|
||||
- destination:
|
||||
host: svc-demo
|
||||
weight: 50
|
||||
- destination:
|
||||
host: svc-demo-canary
|
||||
weight: 50
|
61
lua_configuration/networking.istio.io/VirtualService/testdata/traffic_routing_with_a_match.yaml
vendored
Normal file
61
lua_configuration/networking.istio.io/VirtualService/testdata/traffic_routing_with_a_match.yaml
vendored
Normal file
|
@ -0,0 +1,61 @@
|
|||
trafficRouting:
|
||||
apiVersion: rollouts.kruise.io/v1alpha1
|
||||
kind: TrafficRouting
|
||||
metadata:
|
||||
name: tr-demo
|
||||
spec:
|
||||
strategy:
|
||||
matches:
|
||||
- headers:
|
||||
- type: Exact
|
||||
name: user-agent
|
||||
value: pc
|
||||
- type: RegularExpression
|
||||
name: name
|
||||
value: ".*demo"
|
||||
objectRef:
|
||||
- service: svc-demo
|
||||
customNetworkRefs:
|
||||
- apiVersion: networking.istio.io/v1alpha3
|
||||
kind: VirtualService
|
||||
name: vs-demo
|
||||
original:
|
||||
apiVersion: networking.istio.io/v1alpha3
|
||||
kind: VirtualService
|
||||
metadata:
|
||||
name: vs-demo
|
||||
spec:
|
||||
hosts:
|
||||
- "*"
|
||||
gateways:
|
||||
- nginx-gateway
|
||||
http:
|
||||
- route:
|
||||
- destination:
|
||||
host: svc-demo
|
||||
subset: base
|
||||
expected:
|
||||
- apiVersion: networking.istio.io/v1alpha3
|
||||
kind: VirtualService
|
||||
metadata:
|
||||
name: vs-demo
|
||||
spec:
|
||||
hosts:
|
||||
- "*"
|
||||
gateways:
|
||||
- nginx-gateway
|
||||
http:
|
||||
- match:
|
||||
- headers:
|
||||
user-agent:
|
||||
exact: pc
|
||||
name:
|
||||
regex: .*demo
|
||||
route:
|
||||
- destination:
|
||||
host: svc-demo
|
||||
subset: canary
|
||||
- route:
|
||||
- destination:
|
||||
host: svc-demo
|
||||
subset: base
|
68
lua_configuration/networking.istio.io/VirtualService/testdata/traffic_routing_with_matches.yaml
vendored
Normal file
68
lua_configuration/networking.istio.io/VirtualService/testdata/traffic_routing_with_matches.yaml
vendored
Normal file
|
@ -0,0 +1,68 @@
|
|||
trafficRouting:
|
||||
apiVersion: rollouts.kruise.io/v1alpha1
|
||||
kind: TrafficRouting
|
||||
metadata:
|
||||
name: tr-demo
|
||||
spec:
|
||||
strategy:
|
||||
matches:
|
||||
- headers:
|
||||
- type: Exact
|
||||
name: user-agent
|
||||
value: pc
|
||||
- headers:
|
||||
- type: RegularExpression
|
||||
name: name
|
||||
value: ".*demo"
|
||||
objectRef:
|
||||
- service: svc-demo
|
||||
customNetworkRefs:
|
||||
- apiVersion: networking.istio.io/v1alpha3
|
||||
kind: VirtualService
|
||||
name: vs-demo
|
||||
original:
|
||||
apiVersion: networking.istio.io/v1alpha3
|
||||
kind: VirtualService
|
||||
metadata:
|
||||
name: vs-demo
|
||||
spec:
|
||||
hosts:
|
||||
- "*"
|
||||
gateways:
|
||||
- nginx-gateway
|
||||
http:
|
||||
- route:
|
||||
- destination:
|
||||
host: svc-demo
|
||||
subset: base
|
||||
expected:
|
||||
- apiVersion: networking.istio.io/v1alpha3
|
||||
kind: VirtualService
|
||||
metadata:
|
||||
name: vs-demo
|
||||
spec:
|
||||
hosts:
|
||||
- "*"
|
||||
gateways:
|
||||
- nginx-gateway
|
||||
http:
|
||||
- match:
|
||||
- headers:
|
||||
name:
|
||||
regex: .*demo
|
||||
route:
|
||||
- destination:
|
||||
host: svc-demo
|
||||
subset: canary
|
||||
- match:
|
||||
- headers:
|
||||
user-agent:
|
||||
exact: pc
|
||||
route:
|
||||
- destination:
|
||||
host: svc-demo
|
||||
subset: canary
|
||||
- route:
|
||||
- destination:
|
||||
host: svc-demo
|
||||
subset: base
|
50
lua_configuration/networking.istio.io/VirtualService/testdata/traffic_routing_with_weight.yaml
vendored
Normal file
50
lua_configuration/networking.istio.io/VirtualService/testdata/traffic_routing_with_weight.yaml
vendored
Normal file
|
@ -0,0 +1,50 @@
|
|||
trafficRouting:
|
||||
apiVersion: rollouts.kruise.io/v1alpha1
|
||||
kind: TrafficRouting
|
||||
metadata:
|
||||
name: tr-demo
|
||||
spec:
|
||||
strategy:
|
||||
weight: 50
|
||||
objectRef:
|
||||
- service: svc-demo
|
||||
customNetworkRefs:
|
||||
- apiVersion: networking.istio.io/v1alpha3
|
||||
kind: VirtualService
|
||||
name: vs-demo
|
||||
original:
|
||||
apiVersion: networking.istio.io/v1alpha3
|
||||
kind: VirtualService
|
||||
metadata:
|
||||
name: vs-demo
|
||||
spec:
|
||||
hosts:
|
||||
- "*"
|
||||
gateways:
|
||||
- nginx-gateway
|
||||
http:
|
||||
- route:
|
||||
- destination:
|
||||
host: svc-demo
|
||||
subset: base
|
||||
expected:
|
||||
- apiVersion: networking.istio.io/v1alpha3
|
||||
kind: VirtualService
|
||||
metadata:
|
||||
name: nginx-vs
|
||||
namespace: demo
|
||||
spec:
|
||||
hosts:
|
||||
- "*"
|
||||
gateways:
|
||||
- nginx-gateway
|
||||
http:
|
||||
- route:
|
||||
- destination:
|
||||
host: svc-demo
|
||||
subset: base
|
||||
weight: 50
|
||||
- destination:
|
||||
host: svc-demo
|
||||
subset: canary
|
||||
weight: 50
|
|
@ -0,0 +1,125 @@
|
|||
spec = obj.data.spec
|
||||
|
||||
if obj.canaryWeight == -1 then
|
||||
obj.canaryWeight = 100
|
||||
obj.stableWeight = 0
|
||||
end
|
||||
|
||||
function GetHost(destination)
|
||||
local host = destination.destination.host
|
||||
dot_position = string.find(host, ".", 1, true)
|
||||
if (dot_position) then
|
||||
host = string.sub(host, 1, dot_position - 1)
|
||||
end
|
||||
return host
|
||||
end
|
||||
|
||||
-- find routes of VirtualService with stableService
|
||||
function GetRulesToPatch(spec, stableService, protocol)
|
||||
local matchedRoutes = {}
|
||||
if (spec[protocol] ~= nil) then
|
||||
for _, rule in ipairs(spec[protocol]) do
|
||||
-- skip routes contain matches
|
||||
if (rule.match == nil) then
|
||||
for _, route in ipairs(rule.route) do
|
||||
if GetHost(route) == stableService then
|
||||
table.insert(matchedRoutes, rule)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
return matchedRoutes
|
||||
end
|
||||
|
||||
function CalculateWeight(route, stableWeight, n)
|
||||
local weight
|
||||
if (route.weight) then
|
||||
weight = math.floor(route.weight * stableWeight / 100)
|
||||
else
|
||||
weight = math.floor(stableWeight / n)
|
||||
end
|
||||
return weight
|
||||
end
|
||||
|
||||
-- generate routes with matches, insert a rule before other rules, only support http headers, cookies etc.
|
||||
function GenerateRoutesWithMatches(spec, matches, stableService, canaryService)
|
||||
for _, match in ipairs(matches) do
|
||||
local route = {}
|
||||
route["match"] = {}
|
||||
for key, value in pairs(match) do
|
||||
local vsMatch = {}
|
||||
vsMatch[key] = {}
|
||||
for _, rule in ipairs(value) do
|
||||
if rule["type"] == "RegularExpression" then
|
||||
matchType = "regex"
|
||||
elseif rule["type"] == "Exact" then
|
||||
matchType = "exact"
|
||||
elseif rule["type"] == "Prefix" then
|
||||
matchType = "prefix"
|
||||
end
|
||||
if key == "headers" then
|
||||
vsMatch[key][rule["name"]] = {}
|
||||
vsMatch[key][rule["name"]][matchType] = rule.value
|
||||
else
|
||||
vsMatch[key][matchType] = rule.value
|
||||
end
|
||||
end
|
||||
table.insert(route["match"], vsMatch)
|
||||
end
|
||||
route.route = {
|
||||
{
|
||||
destination = {}
|
||||
}
|
||||
}
|
||||
-- stableService == canaryService indicates DestinationRule exists and subset is set to be canary by default
|
||||
if stableService == canaryService then
|
||||
route.route[1].destination.host = stableService
|
||||
route.route[1].destination.subset = "canary"
|
||||
else
|
||||
route.route[1].destination.host = canaryService
|
||||
end
|
||||
table.insert(spec.http, 1, route)
|
||||
end
|
||||
end
|
||||
|
||||
-- generate routes without matches, change every rule whose host is stableService
|
||||
function GenerateRoutes(spec, stableService, canaryService, stableWeight, canaryWeight, protocol)
|
||||
local matchedRules = GetRulesToPatch(spec, stableService, protocol)
|
||||
for _, rule in ipairs(matchedRules) do
|
||||
local canary
|
||||
if stableService ~= canaryService then
|
||||
canary = {
|
||||
destination = {
|
||||
host = canaryService,
|
||||
},
|
||||
weight = canaryWeight,
|
||||
}
|
||||
else
|
||||
canary = {
|
||||
destination = {
|
||||
host = stableService,
|
||||
subset = "canary",
|
||||
},
|
||||
weight = canaryWeight,
|
||||
}
|
||||
end
|
||||
|
||||
-- incase there are multiple versions traffic already, do a for-loop
|
||||
for _, route in ipairs(rule.route) do
|
||||
-- update stable service weight
|
||||
route.weight = CalculateWeight(route, stableWeight, #rule.route)
|
||||
end
|
||||
table.insert(rule.route, canary)
|
||||
end
|
||||
end
|
||||
|
||||
if (obj.matches)
|
||||
then
|
||||
GenerateRoutesWithMatches(spec, obj.matches, obj.stableService, obj.canaryService)
|
||||
else
|
||||
GenerateRoutes(spec, obj.stableService, obj.canaryService, obj.stableWeight, obj.canaryWeight, "http")
|
||||
GenerateRoutes(spec, obj.stableService, obj.canaryService, obj.stableWeight, obj.canaryWeight, "tcp")
|
||||
GenerateRoutes(spec, obj.stableService, obj.canaryService, obj.stableWeight, obj.canaryWeight, "tls")
|
||||
end
|
||||
return obj.data
|
Loading…
Reference in New Issue