Skip to content

Commit e3d8929

Browse files
committed
Supporting Istio version 1.3.0
This release of Citrix `istio-adaptor` is compatible with Istio Version 1.3.0
1 parent 33e37a6 commit e3d8929

File tree

1,024 files changed

+338110
-63202
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

1,024 files changed

+338110
-63202
lines changed

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
## Description
1414

15-
This repository contains various integrations of [Citrix ADC](https://www.citrix.com/products/citrix-adc/platforms.html) with [Istio 1.1.2](https://istio.io/).
15+
This repository contains various integrations of [Citrix ADC](https://www.citrix.com/products/citrix-adc/platforms.html) with [Istio 1.3.0](https://istio.io/).
1616

1717
# Table of Contents
1818

@@ -110,7 +110,7 @@ The detailed list of fields supported on Citrix ADC as per the Istio CRDs (Desti
110110

111111
## <a name="release-notes">Release Notes</a>
112112

113-
Click [here](docs/release-notes.md) for the release notes of the latest Citrix `istio-adaptor`.
113+
Click [here](https://github.com/citrix/citrix-istio-adaptor/releases) for the release notes of the latest Citrix `istio-adaptor`.
114114

115115
## <a name="contributions">Contributions</a>
116116

Version

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1.0.0
1+
1.1.0

adsclient/ads_client.go

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -114,9 +114,11 @@ func cdsHandler(client *AdsClient, m *xdsapi.DiscoveryResponse) {
114114
clusterNames := make(map[string]bool)
115115
edsResources := make(map[string]interface{})
116116
requestEds := false
117+
// Before Istio v1.3, DiscoveryResponse had Resources field declared as []types.Any.
118+
// From v1.3 onwards, Resources field is declared as []*types.Any.
117119
cdsResource := &xdsapi.Cluster{}
118120
for _, resource := range m.Resources {
119-
if err := types.UnmarshalAny(&resource, cdsResource); err != nil {
121+
if err := types.UnmarshalAny(resource, cdsResource); err != nil {
120122
continue
121123
}
122124
clusterNames[cdsResource.Name] = true
@@ -147,9 +149,11 @@ func ldsHandler(client *AdsClient, m *xdsapi.DiscoveryResponse) {
147149
ldsResources := make(map[string]interface{})
148150
requestRds := false
149151
requestCds := false
152+
// Before Istio v1.3, DiscoveryResponse had Resources field declared as []types.Any.
153+
// From v1.3 onwards, Resources field is declared as []*types.Any.
150154
ldsResource := &xdsapi.Listener{}
151155
for _, resource := range m.Resources {
152-
if err := types.UnmarshalAny(&resource, ldsResource); err != nil {
156+
if err := types.UnmarshalAny(resource, ldsResource); err != nil {
153157
}
154158
ldsResources[ldsResource.Name] = true
155159
dependentResources := client.ldsAddHandler(client.nsConfigAdaptor, ldsResource)
@@ -190,7 +194,7 @@ func ldsHandler(client *AdsClient, m *xdsapi.DiscoveryResponse) {
190194
func edsHandler(client *AdsClient, m *xdsapi.DiscoveryResponse) {
191195
edsResource := &xdsapi.ClusterLoadAssignment{}
192196
for _, resource := range m.Resources {
193-
if err := types.UnmarshalAny(&resource, edsResource); err != nil {
197+
if err := types.UnmarshalAny(resource, edsResource); err != nil {
194198
}
195199
if _, ok := client.apiRequests[edsURL].resources[edsResource.GetClusterName()]; !ok {
196200
log.Printf("[ERROR]: received an EDS resource that we haven't yet subscribed for %s ... ignoring", edsResource.GetClusterName())
@@ -205,7 +209,7 @@ func rdsHandler(client *AdsClient, m *xdsapi.DiscoveryResponse) {
205209
rdsToLds := make(map[string][]*xdsapi.RouteConfiguration)
206210
for _, resource := range m.Resources {
207211
rdsResource := &xdsapi.RouteConfiguration{}
208-
if err := types.UnmarshalAny(&resource, rdsResource); err != nil {
212+
if err := types.UnmarshalAny(resource, rdsResource); err != nil {
209213
continue
210214
}
211215
if _, ok := client.apiRequests[rdsURL].resources[rdsResource.GetName()]; !ok {

adsclient/ads_handler.go

Lines changed: 86 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,15 @@ import (
1717
"citrix-istio-adaptor/nsconfigengine"
1818
"fmt"
1919
xdsapi "github.com/envoyproxy/go-control-plane/envoy/api/v2"
20+
core "github.com/envoyproxy/go-control-plane/envoy/api/v2/core"
21+
xdsListener "github.com/envoyproxy/go-control-plane/envoy/api/v2/listener"
2022
xdsRoute "github.com/envoyproxy/go-control-plane/envoy/api/v2/route"
2123
envoyFault "github.com/envoyproxy/go-control-plane/envoy/config/filter/http/fault/v2"
2224
envoyFilterHttp "github.com/envoyproxy/go-control-plane/envoy/config/filter/network/http_connection_manager/v2"
2325
envoyFilterTcp "github.com/envoyproxy/go-control-plane/envoy/config/filter/network/tcp_proxy/v2"
2426
envoyType "github.com/envoyproxy/go-control-plane/envoy/type"
2527
envoyUtil "github.com/envoyproxy/go-control-plane/pkg/util"
28+
proto "github.com/gogo/protobuf/proto"
2629
types "github.com/gogo/protobuf/types"
2730
istioAuth "istio.io/api/authentication/v1alpha1"
2831
istioFilter "istio.io/api/envoy/config/filter/http/authn/v2alpha1"
@@ -132,6 +135,30 @@ func clusterAdd(nsConfig *configAdaptor, cluster *xdsapi.Cluster, data interface
132135
RootCertFilename: cluster.GetTlsContext().GetCommonTlsContext().GetValidationContext().GetTrustedCa().GetFilename()})
133136
}
134137
}
138+
/* Outlier Detection */
139+
if serviceType == "HTTP" && cluster.GetOutlierDetection() != nil {
140+
lbObj.LbMonitorObj = new(nsconfigengine.LBMonitor)
141+
lbObj.LbMonitorObj.Retries = int(cluster.GetOutlierDetection().GetConsecutiveGatewayFailure().GetValue())
142+
if cluster.GetOutlierDetection().GetInterval() != nil {
143+
if cluster.GetOutlierDetection().GetInterval().GetNanos() != 0 { // If units are in Nano seconds, convert all to milli seconds as Citrix ADC understands that as smallest unit
144+
lbObj.LbMonitorObj.Interval = int(cluster.GetOutlierDetection().GetInterval().GetSeconds()*1000) + int(cluster.GetOutlierDetection().GetInterval().GetNanos())/valueNameToNum["MILLION"]
145+
lbObj.LbMonitorObj.IntervalUnits = "MSEC"
146+
} else {
147+
lbObj.LbMonitorObj.Interval = int(cluster.GetOutlierDetection().GetInterval().GetSeconds())
148+
lbObj.LbMonitorObj.IntervalUnits = "SEC"
149+
}
150+
}
151+
if cluster.GetOutlierDetection().GetBaseEjectionTime() != nil {
152+
if cluster.GetOutlierDetection().GetBaseEjectionTime().GetNanos() != 0 {
153+
lbObj.LbMonitorObj.DownTime = int(cluster.GetOutlierDetection().GetBaseEjectionTime().GetSeconds()*1000) + int(cluster.GetOutlierDetection().GetBaseEjectionTime().GetNanos())/valueNameToNum["MILLION"]
154+
lbObj.LbMonitorObj.DownTimeUnits = "MSEC"
155+
} else {
156+
lbObj.LbMonitorObj.DownTime = int(cluster.GetOutlierDetection().GetBaseEjectionTime().GetSeconds())
157+
lbObj.LbMonitorObj.DownTimeUnits = "SEC"
158+
}
159+
}
160+
}
161+
135162
nsConfig.addConfig(&configBlock{configType: cdsAdd, resourceName: lbObj.Name, resource: lbObj})
136163
if (cluster.GetType() == xdsapi.Cluster_STATIC) || (cluster.GetType() == xdsapi.Cluster_STRICT_DNS) {
137164
if cluster.GetLoadAssignment() != nil {
@@ -169,7 +196,7 @@ func getAuthConfig(nsConfig *configAdaptor, listenerName string, httpFilters []*
169196
switch httpFilter.GetName() {
170197
case "istio_authn":
171198
filterConfig := &istioFilter.FilterConfig{}
172-
if err := envoyUtil.StructToMessage(httpFilter.GetConfig(), filterConfig); err == nil {
199+
if err := getHTTPFilterConfig(httpFilter, filterConfig); err == nil {
173200
authnPolicy := filterConfig.GetPolicy()
174201
for _, origin := range authnPolicy.GetOrigins() {
175202
authSpec := &nsconfigengine.AuthSpec{Name: nsconfigengine.GetNSCompatibleName(listenerName), Issuer: origin.GetJwt().GetIssuer(), JwksURI: origin.GetJwt().GetJwksUri(), Audiences: origin.GetJwt().GetAudiences()}
@@ -184,6 +211,8 @@ func getAuthConfig(nsConfig *configAdaptor, listenerName string, httpFilters []*
184211
authSpec.FrontendTLS = append(authSpec.FrontendTLS, nsconfigengine.SSLSpec{CertFilename: clientCertFile, PrivateKeyFilename: clientKeyFile, RootCertFilename: cacertFile})
185212
return authSpec
186213
}
214+
} else {
215+
log.Printf("[TRACE] getHTTPFilterConfig returned error!")
187216
}
188217
break
189218
}
@@ -224,10 +253,21 @@ func getListenerConfig(nsConfig *configAdaptor, listener *xdsapi.Listener, servi
224253
return csObj
225254
}
226255

256+
func isSNIListener(filterChain *xdsListener.FilterChain) bool {
257+
if filterChain.GetFilterChainMatch().GetServerNames() != nil {
258+
return true
259+
}
260+
return false
261+
}
262+
227263
func getListenerType(l *xdsapi.Listener) (string, string, string, error) {
228264
listenerAddress := l.GetAddress()
229265
tlsContextExists := false
230266
for _, filterChain := range l.GetFilterChains() {
267+
// TODO: Handling FilterChainMatch case.
268+
if l.GetTrafficDirection() != core.TrafficDirection_INBOUND && filterChain.GetFilterChainMatch() != nil && isSNIListener(filterChain) == false {
269+
continue
270+
}
231271
if filterChain.GetTlsContext() != nil {
232272
tlsContextExists = true
233273
}
@@ -252,12 +292,40 @@ func getListenerType(l *xdsapi.Listener) (string, string, string, error) {
252292
return "", "", "", fmt.Errorf("Unknown filter type")
253293
}
254294

295+
func getListenerFilterConfig(filter *xdsListener.Filter, out proto.Message) error {
296+
switch c := filter.ConfigType.(type) {
297+
case *xdsListener.Filter_Config:
298+
if err := envoyUtil.StructToMessage(c.Config, out); err != nil {
299+
return err
300+
}
301+
case *xdsListener.Filter_TypedConfig:
302+
if err := types.UnmarshalAny(c.TypedConfig, out); err != nil {
303+
return err
304+
}
305+
}
306+
return nil
307+
}
308+
309+
func getHTTPFilterConfig(filter *envoyFilterHttp.HttpFilter, out proto.Message) error {
310+
switch c := filter.ConfigType.(type) {
311+
case *envoyFilterHttp.HttpFilter_Config:
312+
if err := envoyUtil.StructToMessage(c.Config, out); err != nil {
313+
return err
314+
}
315+
case *envoyFilterHttp.HttpFilter_TypedConfig:
316+
if err := types.UnmarshalAny(c.TypedConfig, out); err != nil {
317+
return err
318+
}
319+
}
320+
return nil
321+
}
322+
255323
func listenerAdd(nsConfig *configAdaptor, listener *xdsapi.Listener) map[string]interface{} {
256324
log.Printf("[TRACE] listenerAdd : %s", listener.GetName())
257325
log.Printf("[TRACE] listenerAdd : %v", listener)
258326
filterType, csVserverType, serviceType, err := getListenerType(listener)
259327
if err != nil {
260-
log.Printf("[ERROR] listenerAdd : getListenerType failed with - %v", err)
328+
log.Printf("[ERROR] listenerAdd %s: getListenerType failed with - %v", listener.GetName(), err)
261329
return nil
262330
}
263331
csObj := getListenerConfig(nsConfig, listener, csVserverType)
@@ -274,11 +342,17 @@ func listenerAdd(nsConfig *configAdaptor, listener *xdsapi.Listener) map[string]
274342
rdsNames = make([]string, 0)
275343
}
276344
for _, filterChain := range listener.GetFilterChains() {
345+
// TODO: Handling FilterChainMatch case.
346+
// Need to create another CS vserver of filter-type with CS policy associated with FilterChainMatch
347+
if listener.GetTrafficDirection() != core.TrafficDirection_INBOUND && filterChain.GetFilterChainMatch() != nil && isSNIListener(filterChain) == false {
348+
continue
349+
}
277350
for _, filter := range filterChain.GetFilters() {
278351
switch filterName := filter.GetName(); filterName {
279352
case envoyUtil.HTTPConnectionManager:
280353
httpCM := &envoyFilterHttp.HttpConnectionManager{}
281-
if err := envoyUtil.StructToMessage(filter.GetConfig(), httpCM); err != nil {
354+
//if err := envoyUtil.StructToMessage(filter.GetConfig(), httpCM); err != nil {
355+
if err := getListenerFilterConfig(filter, httpCM); err != nil {
282356
log.Printf("[ERROR] listenerAdd: Error loading http connection manager: %v", err)
283357
} else {
284358
csObj.AuthSpec = getAuthConfig(nsConfig, csObj.Name, httpCM.GetHttpFilters())
@@ -292,7 +366,8 @@ func listenerAdd(nsConfig *configAdaptor, listener *xdsapi.Listener) map[string]
292366
}
293367
case envoyUtil.TCPProxy:
294368
tcpProxy := &envoyFilterTcp.TcpProxy{}
295-
if err := envoyUtil.StructToMessage(filter.GetConfig(), tcpProxy); err != nil {
369+
//if err := envoyUtil.StructToMessage(filter.GetConfig(), tcpProxy); err != nil {
370+
if err := getListenerFilterConfig(filter, tcpProxy); err != nil {
296371
log.Printf("[ERROR] listenerAdd: Error loading tcp proxy filter: %v", err)
297372
} else {
298373
if tcpProxy.GetCluster() != "" {
@@ -406,11 +481,11 @@ func getPersistencyPolicy(hashPolicy []*xdsRoute.RouteAction_HashPolicy) *nsconf
406481
return persistency
407482
}
408483

409-
func getFault(perFilterConfig map[string]*types.Struct) nsconfigengine.Fault {
484+
func getFault(typedPerFilterConfig map[string]*types.Any) nsconfigengine.Fault {
410485
fault := nsconfigengine.Fault{}
411-
if _, ok := perFilterConfig[envoyUtil.Fault]; ok {
486+
if _, ok := typedPerFilterConfig[envoyUtil.Fault]; ok {
412487
envoyFaultConfig := &envoyFault.HTTPFault{}
413-
if err := envoyUtil.StructToMessage(perFilterConfig[envoyUtil.Fault], envoyFaultConfig); err == nil {
488+
if err := types.UnmarshalAny(typedPerFilterConfig[envoyUtil.Fault], envoyFaultConfig); err == nil {
414489
if envoyFaultConfig.GetAbort() != nil {
415490
percent := envoyFaultConfig.GetAbort().GetPercentage()
416491
numerator := percent.GetNumerator()
@@ -462,12 +537,13 @@ func routeUpdate(nsConfig *configAdaptor, routes []*xdsapi.RouteConfiguration, d
462537
rule.Headers = append(rule.Headers, nsconfigengine.MatchHeader{Name: headers.GetName(), Exact: headers.GetExactMatch(), Prefix: headers.GetRegexMatch(), Regex: headers.GetPrefixMatch()})
463538
}
464539
binding.Rule = rule
465-
if vroute.GetPerFilterConfig() != nil {
466-
binding.Fault = getFault(vroute.GetPerFilterConfig())
540+
if vroute.GetTypedPerFilterConfig() != nil {
541+
binding.Fault = getFault(vroute.GetTypedPerFilterConfig())
467542
}
468543
binding.RwPolicy.PrefixRewrite = vroute.GetRoute().GetPrefixRewrite()
469544
binding.RwPolicy.HostRewrite = vroute.GetRoute().GetHostRewrite()
470-
for _, reqAddHeader := range vroute.GetRoute().GetRequestHeadersToAdd() {
545+
//for _, reqAddHeader := range vroute.GetRoute().GetRequestHeadersToAdd() OLD - 1.1.2
546+
for _, reqAddHeader := range vroute.GetRequestHeadersToAdd() {
471547
binding.RwPolicy.AddHeaders = append(binding.RwPolicy.AddHeaders, nsconfigengine.RwHeader{Key: reqAddHeader.GetHeader().GetKey(), Value: reqAddHeader.GetHeader().GetValue()})
472548
}
473549
var persistency *nsconfigengine.PersistencyPolicy

adsclient/ads_handler_test.go

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ func getNsConfAdaptor() *configAdaptor {
9090
func verifyObject(nsConfAdaptor *configAdaptor, configType discoveryType, resourceName string, expectedResource interface{}, expectedResponse interface{}, receivedResponse interface{}) error {
9191
compare := reflect.DeepEqual(expectedResponse, receivedResponse)
9292
if compare == false {
93-
return fmt.Errorf("Expected response: %s/%+v Recevied resource:%s/%+v", reflect.TypeOf(expectedResponse).String(), expectedResponse, reflect.TypeOf(receivedResponse).String(), receivedResponse)
93+
return fmt.Errorf("Expected response: %s/%+v Received resource:%s/%+v", reflect.TypeOf(expectedResponse).String(), expectedResponse, reflect.TypeOf(receivedResponse).String(), receivedResponse)
9494
}
9595
confBl, err := nsConfAdaptor.getConfigByName(nsconfigengine.GetNSCompatibleName(resourceName), configType)
9696
if err != nil {
@@ -99,7 +99,7 @@ func verifyObject(nsConfAdaptor *configAdaptor, configType discoveryType, resour
9999
log.Printf("Comapring %v with %v", confBl.resource, expectedResource)
100100
compare = reflect.DeepEqual(confBl.resource, expectedResource)
101101
if compare == false {
102-
return fmt.Errorf("Expected resource:%s/%+v Recevied resource:%s/%+v", reflect.TypeOf(expectedResource).String(), expectedResource, reflect.TypeOf(confBl.resource).String(), confBl.resource)
102+
return fmt.Errorf("Expected resource:%s/%+v Received resource:%s/%+v", reflect.TypeOf(expectedResource).String(), expectedResource, reflect.TypeOf(confBl.resource).String(), confBl.resource)
103103
}
104104
return nil
105105
}
@@ -109,11 +109,19 @@ func Test_clusterAdd(t *testing.T) {
109109
nsConfAdaptor := getNsConfAdaptor()
110110

111111
log.Println("HTTP cluster add")
112+
cds.OutlierDetection = &v2Cluster.OutlierDetection{Interval: &types.Duration{Seconds: int64(5), Nanos: int32(100000000)}, BaseEjectionTime: &types.Duration{Seconds: int64(7)}, ConsecutiveGatewayFailure: &types.UInt32Value{Value: uint32(9)}}
112113
lbObj := &nsconfigengine.LBApi{Name: "c1", FrontendServiceType: "HTTP", LbMethod: "ROUNDROBIN", BackendServiceType: "HTTP", MaxConnections: 1024, MaxHTTP2ConcurrentStreams: 1000, NetprofileName: "k8s"}
114+
lbObj.LbMonitorObj = new(nsconfigengine.LBMonitor)
115+
lbObj.LbMonitorObj.Retries = 9
116+
lbObj.LbMonitorObj.Interval = 5100
117+
lbObj.LbMonitorObj.IntervalUnits = "MSEC"
118+
lbObj.LbMonitorObj.DownTime = 7
119+
lbObj.LbMonitorObj.DownTimeUnits = "SEC"
113120
err := verifyObject(nsConfAdaptor, cdsAdd, "c1", lbObj, "c1", clusterAdd(nsConfAdaptor, cds, "HTTP"))
114121
if err != nil {
115122
t.Errorf("Verification failed - %v", err)
116123
}
124+
lbObj.LbMonitorObj = nil
117125

118126
log.Println("TCP cluster add")
119127
lbObj.FrontendServiceType = "TCP"
@@ -127,16 +135,23 @@ func Test_clusterAdd(t *testing.T) {
127135
cds.CircuitBreakers = &v2Cluster.CircuitBreakers{Thresholds: []*v2Cluster.CircuitBreakers_Thresholds{&v2Cluster.CircuitBreakers_Thresholds{MaxConnections: &types.UInt32Value{Value: uint32(500)}, MaxRequests: &types.UInt32Value{Value: uint32(750)}}}}
128136
cds.MaxRequestsPerConnection = &types.UInt32Value{Value: uint32(100)}
129137
cds.TlsContext = &auth.UpstreamTlsContext{CommonTlsContext: env.MakeTLSContext("/etc/certs/server-cert.crt", "/etc/certs/server-key.key", "")}
138+
cds.OutlierDetection = &v2Cluster.OutlierDetection{Interval: &types.Duration{Seconds: int64(21000)}, BaseEjectionTime: &types.Duration{Seconds: int64(7), Nanos: int32(500000000)}}
130139
lbObj.FrontendServiceType = "HTTP"
131140
lbObj.BackendServiceType = "SSL"
132141
lbObj.MaxConnections = 500
133142
lbObj.MaxRequestsPerConnection = 100
134143
lbObj.MaxHTTP2ConcurrentStreams = 750
135144
lbObj.BackendTLS = []nsconfigengine.SSLSpec{{SNICert: false, CertFilename: "/etc/certs/server-cert.crt", PrivateKeyFilename: "/etc/certs/server-key.key"}}
145+
lbObj.LbMonitorObj = new(nsconfigengine.LBMonitor)
146+
lbObj.LbMonitorObj.Interval = 21000
147+
lbObj.LbMonitorObj.IntervalUnits = "SEC"
148+
lbObj.LbMonitorObj.DownTime = 7500
149+
lbObj.LbMonitorObj.DownTimeUnits = "MSEC"
136150
err = verifyObject(nsConfAdaptor, cdsAdd, "c1", lbObj, "c1", clusterAdd(nsConfAdaptor, cds, "HTTP"))
137151
if err != nil {
138152
t.Errorf("Verification failed - %v", err)
139153
}
154+
lbObj.LbMonitorObj = nil
140155

141156
log.Println("SSL_TCP cluster add")
142157
lbObj.FrontendServiceType = "TCP"
@@ -145,7 +160,6 @@ func Test_clusterAdd(t *testing.T) {
145160
if err != nil {
146161
t.Errorf("Verification failed - %v", err)
147162
}
148-
149163
}
150164

151165
func Test_clusterDel(t *testing.T) {

adsclient/nsconf_adaptor.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ func (confAdaptor *configAdaptor) sidecarBootstrapConfig() error {
166166

167167
func (confAdaptor *configAdaptor) bootstrapConfig() error {
168168
var err error
169-
err = confAdaptor.client.EnableFeatures([]string{"lb", "cs", "ssl", "rewrite", "responder", "aaa"})
169+
err = confAdaptor.client.EnableFeatures([]string{"lb", "cs", "ssl", "rewrite", "responder"})
170170
if err != nil {
171171
return err
172172
}
@@ -184,7 +184,13 @@ func (confAdaptor *configAdaptor) bootstrapConfig() error {
184184
// Dummy HTTP Vserver is added for Redirect Case
185185
{ResourceType: netscaler.Lbvserver.Type(), ResourceName: "ns_dummy_http", Resource: lb.Lbvserver{Name: "ns_dummy_http", Servicetype: "HTTP"}},
186186
{ResourceType: netscaler.Lbvserver_service_binding.Type(), ResourceName: "ns_dummy_http", Resource: lb.Lbvserverservicebinding{Name: "ns_dummy_http", Servicename: "ns_blackhole_http"}, IgnoreErrors: []string{"Resource already exists"}},
187-
{ResourceType: netscaler.Tmsessionparameter.Type(), ResourceName: "", Resource: tm.Tmsessionparameter{Defaultauthorizationaction: "ALLOW"}, Operation: "set"},
187+
}
188+
err = confAdaptor.client.EnableFeatures([]string{"aaa"})
189+
if err != nil {
190+
log.Println("[WARN] aaa feature is not enabled and JWT authentication will not work")
191+
} else {
192+
193+
configs = append(configs, nsconfigengine.NsConfigEntity{ResourceType: netscaler.Tmsessionparameter.Type(), ResourceName: "", Resource: tm.Tmsessionparameter{Defaultauthorizationaction: "ALLOW"}, Operation: "set"})
188194
}
189195
if len(confAdaptor.netProfile) > 0 {
190196
netprof := nsconfigengine.NsConfigEntity{

charts/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Citrix ADC CPX in Istio Helm Chart
22

3-
This repository contains [helm](https://helm.sh) charts for installing Citrix ADC CPX as Ingress Gateway and sidecar proxy in [Istio](https://istio.io)v1.1.2.
3+
This repository contains [helm](https://helm.sh) charts for installing Citrix ADC CPX as Ingress Gateway and sidecar proxy in [Istio](https://istio.io)v1.3.0.
44

55

66
> Note: Charts may require access to kube-system namespace and/or cluster wide permissions for full functionality. Install/configure helm/tiller appropriately.

charts/stable/citrix-adc-istio-ingress-gateway/Chart.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ apiVersion: v1
22
appVersion: "1.0"
33
description: A Helm chart for Citrix ADC as Ingress Gateway installation in Istio Service Mesh on Kubernetes platform
44
name: citrix-adc-istio-ingress-gateway
5-
version: 1.0.0
6-
icon: https://github.com/citrix/citrix-istio-adaptor/blob/master/docs/media/Citrix_icon.png
5+
version: 1.1.0
6+
icon: https://raw.githubusercontent.com/citrix/citrix-k8s-ingress-controller/gh-pages/icon.png
77
home: https://www.citrix.com
88
sources:
99
- https://github.com/citrix/citrix-istio-adaptor

0 commit comments

Comments
 (0)