Skip to content

Commit d4600c3

Browse files
authored
Releasing xDS-adaptor v0.9.9.1 (#34)
* Releasing xDS-adaptor v0.9.9-1 Signed-off-by: “Subash <subash.dangol@citrix.com>
1 parent 48d8e49 commit d4600c3

File tree

7 files changed

+35
-8
lines changed

7 files changed

+35
-8
lines changed

adsclient/ads_client.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -552,12 +552,12 @@ func (client *AdsClient) assignConfigAdaptor() error {
552552
defer client.nsConfigAdaptorMux.Unlock()
553553
if client.nsConfigAdaptor == nil {
554554
client.nsConfigAdaptor, err = newConfigAdaptor(client.nsInfo)
555-
client.certWatcher.nsConfig = client.nsConfigAdaptor
556-
client.nsConfigAdaptor.watch = client.certWatcher
557555
if err != nil {
558556
xDSLogger.Error("assignConfigAdaptor: Could not create nsConfigAdaptor", "error", err.Error())
559557
return err
560558
}
559+
client.certWatcher.nsConfig = client.nsConfigAdaptor
560+
client.nsConfigAdaptor.watch = client.certWatcher
561561
client.nsConfigAdaptor.startConfigAdaptor(client)
562562
}
563563
return nil

adsclient/ads_handler.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,10 @@ const (
4747
localHostIP = "127.0.0.1"
4848
nsLoopbackIP = "192.0.0.2"
4949
logStreamPort = 5557 // Logstream is used for Transactional data which is used in tracing (e.g. zipkin)
50+
logStreamPort5558 = 5558
5051
ulfdRestPort = 5563 // Rest port is used for time-series data which is used in Prometheus
52+
licensingPort = 27000
53+
licensingPort7279 = 7279
5154
defaultWeight = 1
5255
defaultMirrorWeight = 100
5356
citrixEgressGateway = "citrix-egressgateway"

adsclient/nsconf_adaptor.go

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,7 @@ func newConfigAdaptor(nsinfo *NSDetails) (*configAdaptor, error) {
147147
jsonLogFormat := getBoolEnv("JSONLOG")
148148
configAdaptor.client, err = netscaler.NewNitroClientFromParams(netscaler.NitroParams{Url: nsinfo.NetscalerURL, Username: nsinfo.NetscalerUsername, Password: nsinfo.NetscalerPassword, SslVerify: nsinfo.SslVerify, RootCAPath: nsinfo.RootCAPath, ServerName: nsinfo.ServerName, LogLevel: logLevel, JSONLogFormat: jsonLogFormat})
149149
if err != nil {
150+
xDSLogger.Error("newConfigAdaptor: Nitroclient creation failed", "error", err)
150151
return nil, err
151152
}
152153
for {
@@ -162,6 +163,7 @@ func newConfigAdaptor(nsinfo *NSDetails) (*configAdaptor, error) {
162163
if isCPX(nsinfo.NetscalerURL) {
163164
err = configAdaptor.sidecarBootstrapConfig()
164165
if err != nil {
166+
xDSLogger.Error("newConfigAdaptor: BootstrapConfig failed", "error", err)
165167
return nil, err
166168
}
167169
}
@@ -232,14 +234,19 @@ func (confAdaptor *configAdaptor) sidecarBootstrapConfig() error {
232234
listenPolicy = listenPolicy + " && CLIENT.TCP.DSTPORT.NE(" + confAdaptor.caServerPort + ")"
233235
}
234236
if len(confAdaptor.analyticsServerIP) > 0 {
235-
listenPolicy = listenPolicy + " && CLIENT.IP.DST.NE(" + confAdaptor.analyticsServerIP + ")"
237+
// Refer https://docs.citrix.com/en-us/citrix-application-delivery-management-service/system-requirements.html#ports
238+
listenPolicy = listenPolicy + " && CLIENT.IP.DST.NE(" + confAdaptor.analyticsServerIP + ")" + " && CLIENT.TCP.DSTPORT.NE(" + fmt.Sprint(logStreamPort) + ")" + " && CLIENT.TCP.DSTPORT.NE(" + fmt.Sprint(logStreamPort5558) + ")" + " && CLIENT.TCP.DSTPORT.NE(" + fmt.Sprint(ulfdRestPort) + ")"
236239
configs = append(configs, nsconfigengine.NsConfigEntity{ResourceType: netscaler.Nsacl.Type(), ResourceName: "allowadmserver", Resource: ns.Nsacl{Aclname: "allowadmserver", Aclaction: "ALLOW", Srcip: true, Srcipval: confAdaptor.analyticsServerIP, Priority: 65537}})
240+
// Identify secure Nitro port to allow Nitro traffic from ADM
241+
snp, _ := nsconfigengine.GetParticularNSField(confAdaptor.client, "nsparam", "mgmthttpsport")
242+
secureNitroPort := fmt.Sprintf("%v", snp)
243+
configs = append(configs, nsconfigengine.NsConfigEntity{ResourceType: netscaler.Nsacl.Type(), ResourceName: "allownitro", Resource: ns.Nsacl{Aclname: "allownitro", Aclaction: "ALLOW", Protocol: "TCP", Destport: true, Destportval: secureNitroPort, Priority: 65540}})
244+
configs = append(configs, nsconfigengine.NsConfigEntity{ResourceType: netscaler.Nsacl.Type(), ResourceName: "allowicmp", Resource: ns.Nsacl{Aclname: "allowicmp", Aclaction: "ALLOW", Protocol: "ICMP", Priority: 65546}})
237245
}
238246
if len(confAdaptor.licenseServerIP) > 0 && confAdaptor.licenseServerIP != confAdaptor.analyticsServerIP {
239-
listenPolicy = listenPolicy + " && CLIENT.IP.DST.NE(" + confAdaptor.licenseServerIP + ")"
247+
listenPolicy = listenPolicy + " && CLIENT.IP.DST.NE(" + confAdaptor.licenseServerIP + ")" + " && CLIENT.TCP.DSTPORT.NE(" + fmt.Sprint(licensingPort) + ")" + " && CLIENT.TCP.DSTPORT.NE(" + fmt.Sprint(licensingPort7279) + ")"
240248
configs = append(configs, nsconfigengine.NsConfigEntity{ResourceType: netscaler.Nsacl.Type(), ResourceName: "allowlicenseserver", Resource: ns.Nsacl{Aclname: "allowlicenseserver", Aclaction: "ALLOW", Srcip: true, Srcipval: confAdaptor.licenseServerIP, Priority: 65538}})
241249
}
242-
// Create drop_all_vserver config
243250
configs = append(configs, nsconfigengine.NsConfigEntity{ResourceType: netscaler.Lbvserver.Type(), ResourceName: "drop_all_vserver", Resource: lb.Lbvserver{Name: "drop_all_vserver", Servicetype: "ANY", Ipv46: "*", Port: 65535, Listenpolicy: listenPolicy}})
244251
configs = append(configs, nsconfigengine.NsConfigEntity{ResourceType: netscaler.Nsacl.Type(), ResourceName: "denyall", Resource: ns.Nsacl{Aclname: "denyall", Aclaction: "DENY", Priority: 100000}})
245252
configs = append(configs, nsconfigengine.NsConfigEntity{ResourceType: netscaler.Nsacls.Type(), ResourceName: "", Resource: ns.Nsacls{}, Operation: "apply"})

adsclient/nsconf_adaptor_test.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,9 @@ func Test_bootstrapConfig(t *testing.T) {
105105
configs2 := []env.VerifyNitroConfig{
106106
{"nsacl", "allowadmserver", map[string]interface{}{"aclname": "allowadmserver", "aclaction": "ALLOW", "srcipval": "1.1.1.1", "priority": 65537}},
107107
{"nsacl", "allowlicenseserver", map[string]interface{}{"aclname": "allowlicenseserver", "aclaction": "ALLOW", "srcipval": "1.1.1.2", "priority": 65538}},
108-
{"lbvserver", "drop_all_vserver", map[string]interface{}{"name": "drop_all_vserver", "servicetype": "ANY", "ipv46": "*", "port": 65535, "listenpolicy": "CLIENT.TCP.DSTPORT.NE(15010) && CLIENT.IP.DST.NE(1.1.1.1) && CLIENT.IP.DST.NE(1.1.1.2)"}},
108+
{"nsacl", "allownitro", map[string]interface{}{"aclname": "allownitro", "aclaction": "ALLOW", "protocol": "TCP", "destportval": "9443", "priority": 65540, "kernelstate": "APPLIED"}},
109+
{"nsacl", "allowicmp", map[string]interface{}{"aclname": "allowicmp", "aclaction": "ALLOW", "protocol": "ICMP", "priority": 65546, "kernelstate": "APPLIED"}},
110+
{"lbvserver", "drop_all_vserver", map[string]interface{}{"name": "drop_all_vserver", "servicetype": "ANY", "ipv46": "*", "port": 65535, "listenpolicy": "CLIENT.TCP.DSTPORT.NE(15010) && CLIENT.IP.DST.NE(1.1.1.1) && CLIENT.TCP.DSTPORT.NE(5557) && CLIENT.TCP.DSTPORT.NE(5558) && CLIENT.TCP.DSTPORT.NE(5563) && CLIENT.IP.DST.NE(1.1.1.2) && CLIENT.TCP.DSTPORT.NE(27000) && CLIENT.TCP.DSTPORT.NE(7279)"}},
109111
}
110112
configs3 := []env.VerifyNitroConfig{}
111113
configs3 = append(configs, configs2...)
@@ -123,7 +125,7 @@ func Test_bootstrapConfig(t *testing.T) {
123125
}
124126
configs2 = []env.VerifyNitroConfig{
125127
{"nsacl", "allowlicenseserver", map[string]interface{}{"aclname": "allowlicenseserver", "aclaction": "ALLOW", "srcipval": "1.1.1.2", "priority": 65538}},
126-
{"lbvserver", "drop_all_vserver", map[string]interface{}{"name": "drop_all_vserver", "servicetype": "ANY", "ipv46": "*", "port": 65535, "listenpolicy": "CLIENT.TCP.DSTPORT.NE(15010) && CLIENT.TCP.DSTPORT.NE(15012) && CLIENT.IP.DST.NE(1.1.1.2)"}},
128+
{"lbvserver", "drop_all_vserver", map[string]interface{}{"name": "drop_all_vserver", "servicetype": "ANY", "ipv46": "*", "port": 65535, "listenpolicy": "CLIENT.TCP.DSTPORT.NE(15010) && CLIENT.TCP.DSTPORT.NE(15012) && CLIENT.IP.DST.NE(1.1.1.2) && CLIENT.TCP.DSTPORT.NE(27000) && CLIENT.TCP.DSTPORT.NE(7279)"}},
127129
}
128130
configs3 = append(configs, configs2...)
129131
err = env.VerifyConfigBlockPresence(configAd.client, configs3)
@@ -140,7 +142,7 @@ func Test_bootstrapConfig(t *testing.T) {
140142
}
141143
configs2 = []env.VerifyNitroConfig{
142144
{"nsacl", "allowadmserver", map[string]interface{}{"aclname": "allowadmserver", "aclaction": "ALLOW", "srcipval": "1.1.1.1", "priority": 65537}},
143-
{"lbvserver", "drop_all_vserver", map[string]interface{}{"name": "drop_all_vserver", "servicetype": "ANY", "ipv46": "*", "port": 65535, "listenpolicy": "CLIENT.TCP.DSTPORT.NE(15010) && CLIENT.IP.DST.NE(1.1.1.1)"}},
145+
{"lbvserver", "drop_all_vserver", map[string]interface{}{"name": "drop_all_vserver", "servicetype": "ANY", "ipv46": "*", "port": 65535, "listenpolicy": "CLIENT.TCP.DSTPORT.NE(15010) && CLIENT.IP.DST.NE(1.1.1.1) && CLIENT.TCP.DSTPORT.NE(5557) && CLIENT.TCP.DSTPORT.NE(5558) && CLIENT.TCP.DSTPORT.NE(5563)"}},
144146
}
145147
configs3 = append(configs, configs2...)
146148
err = env.VerifyConfigBlockPresence(configAd.client, configs3)

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ require (
1212
github.com/kr/pretty v0.2.1
1313
github.com/openshift/api v3.9.1-0.20191008181517-e4fd21196097+incompatible
1414
github.com/sirupsen/logrus v1.7.0
15+
github.com/spf13/cobra v1.0.0 // indirect
1516
github.com/spiffe/go-spiffe v1.0.0
1617
github.com/stretchr/testify v1.7.0
1718
github.com/txn2/txeh v1.3.0

go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,7 @@ github.com/citrix/adc-nitro-go v0.0.0-20210616092114-c917a2b77ef3 h1:qc1KwolVG6G
174174
github.com/citrix/adc-nitro-go v0.0.0-20210616092114-c917a2b77ef3/go.mod h1:1SPLFfIOtWnKiNWEuLhRqGrEi6VxGkXt4gpWa+mhaCg=
175175
github.com/citrix/adc-nitro-go v0.0.0-20210701174421-a3bd5f0e580a h1:eVmWPQ/A+dk+dAVLszXUZEY5Dpuxd4pwK6peOdU6/gQ=
176176
github.com/citrix/adc-nitro-go v0.0.0-20210701174421-a3bd5f0e580a/go.mod h1:1SPLFfIOtWnKiNWEuLhRqGrEi6VxGkXt4gpWa+mhaCg=
177+
github.com/citrix/adc-nitro-go v0.0.0-20210906082353-a57db5c1f504 h1:t+zgkZvOJW9P9IwGw4SowOTGNoYxeryuN4iqC0TbL8I=
177178
github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE=
178179
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
179180
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
@@ -577,6 +578,7 @@ github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJ
577578
github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
578579
github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
579580
github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
581+
github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
580582
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
581583
github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo=
582584
github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=

nsconfigengine/config.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -281,3 +281,15 @@ func GetLogString(data interface{}) string {
281281
m1 = regexp.MustCompile("BEGIN EC PRIVATE KEY(.*)END EC PRIVATE KEY")
282282
return m1.ReplaceAllString(s, " XXX ")
283283
}
284+
285+
// GetParticularNSField function will return the value for the provided fieldName from the provided resourceType.
286+
// If fieldName doesn't exist in resourceType, then returned value will be nil.
287+
func GetParticularNSField(client *netscaler.NitroClient, resourceType, fieldName string) (interface{}, error) {
288+
res, err := client.FindResource(resourceType, "")
289+
//[]map[string]interface{}, error = FindResourceArrayWithParams(findParams FindParams)
290+
if err != nil {
291+
nsconfLogger.Error("GetParticularNSField: Could not get fieldName value for resource", "resource", resourceType, "fieldName", fieldName, "error", err)
292+
return nil, err
293+
}
294+
return res[fieldName], nil
295+
}

0 commit comments

Comments
 (0)