mirror of
https://github.com/cgrates/cgrates.git
synced 2026-02-11 10:06:24 +05:00
Add options to support non-Amazon S3 and SQS
This commit is contained in:
committed by
Dan Christian Bogos
parent
84f0338605
commit
626346e19b
@@ -477,9 +477,13 @@ const CGRATES_CFG_JSON = `
|
|||||||
|
|
||||||
// SQS
|
// SQS
|
||||||
// "sqsQueueID": "cgrates_cdrs", // the queue id for SQS readers from were the events are read
|
// "sqsQueueID": "cgrates_cdrs", // the queue id for SQS readers from were the events are read
|
||||||
|
// "sqsForcePathStyle": false, // when true, force the request to use path-style addressing, i.e., http://s3.amazonaws.com/BUCKET/KEY. If false, (http://BUCKET.s3.amazonaws.com/KEY)
|
||||||
|
// "sqsSkipTlsVerify": false, // if enabled Http Client will accept any TLS certificate
|
||||||
|
|
||||||
// S3
|
// S3
|
||||||
// "s3BucketID": "cgrates_cdrs", // the bucket id for S3 readers from were the events are read
|
// "s3BucketID": "cgrates_cdrs", // the bucket id for S3 readers from were the events are read
|
||||||
|
// "s3ForcePathStyle": false, // when true, force the request to use path-style addressing, i.e., http://s3.amazonaws.com/BUCKET/KEY. If false, (http://BUCKET.s3.amazonaws.com/KEY)
|
||||||
|
// "s3SkipTlsVerify": false, // if enabled Http Client will accept any TLS certificate
|
||||||
|
|
||||||
// nats
|
// nats
|
||||||
// "natsJetStream": false, // controls if the nats reader uses the JetStream
|
// "natsJetStream": false, // controls if the nats reader uses the JetStream
|
||||||
|
|||||||
@@ -210,8 +210,12 @@ type EventExporterOpts struct {
|
|||||||
AWSSecret *string
|
AWSSecret *string
|
||||||
AWSToken *string
|
AWSToken *string
|
||||||
SQSQueueID *string
|
SQSQueueID *string
|
||||||
|
SQSForcePathStyle *bool
|
||||||
|
SQSSkipTlsVerify *bool
|
||||||
S3BucketID *string
|
S3BucketID *string
|
||||||
S3FolderPath *string
|
S3FolderPath *string
|
||||||
|
S3ForcePathStyle *bool
|
||||||
|
S3SkipTlsVerify *bool
|
||||||
NATSJetStream *bool
|
NATSJetStream *bool
|
||||||
NATSSubject *string
|
NATSSubject *string
|
||||||
NATSJWTFile *string
|
NATSJWTFile *string
|
||||||
@@ -435,12 +439,24 @@ func (eeOpts *EventExporterOpts) loadFromJSONCfg(jsnCfg *EventExporterOptsJson)
|
|||||||
if jsnCfg.SQSQueueID != nil {
|
if jsnCfg.SQSQueueID != nil {
|
||||||
eeOpts.SQSQueueID = jsnCfg.SQSQueueID
|
eeOpts.SQSQueueID = jsnCfg.SQSQueueID
|
||||||
}
|
}
|
||||||
|
if jsnCfg.SQSForcePathStyle != nil {
|
||||||
|
eeOpts.SQSForcePathStyle = jsnCfg.SQSForcePathStyle
|
||||||
|
}
|
||||||
|
if jsnCfg.SQSSkipTlsVerify != nil {
|
||||||
|
eeOpts.SQSSkipTlsVerify = jsnCfg.SQSSkipTlsVerify
|
||||||
|
}
|
||||||
if jsnCfg.S3BucketID != nil {
|
if jsnCfg.S3BucketID != nil {
|
||||||
eeOpts.S3BucketID = jsnCfg.S3BucketID
|
eeOpts.S3BucketID = jsnCfg.S3BucketID
|
||||||
}
|
}
|
||||||
if jsnCfg.S3FolderPath != nil {
|
if jsnCfg.S3FolderPath != nil {
|
||||||
eeOpts.S3FolderPath = jsnCfg.S3FolderPath
|
eeOpts.S3FolderPath = jsnCfg.S3FolderPath
|
||||||
}
|
}
|
||||||
|
if jsnCfg.S3ForcePathStyle != nil {
|
||||||
|
eeOpts.S3ForcePathStyle = jsnCfg.S3ForcePathStyle
|
||||||
|
}
|
||||||
|
if jsnCfg.S3SkipTlsVerify != nil {
|
||||||
|
eeOpts.S3SkipTlsVerify = jsnCfg.S3SkipTlsVerify
|
||||||
|
}
|
||||||
if jsnCfg.NATSJetStream != nil {
|
if jsnCfg.NATSJetStream != nil {
|
||||||
eeOpts.NATSJetStream = jsnCfg.NATSJetStream
|
eeOpts.NATSJetStream = jsnCfg.NATSJetStream
|
||||||
}
|
}
|
||||||
@@ -805,6 +821,14 @@ func (eeOpts *EventExporterOpts) Clone() *EventExporterOpts {
|
|||||||
cln.SQSQueueID = new(string)
|
cln.SQSQueueID = new(string)
|
||||||
*cln.SQSQueueID = *eeOpts.SQSQueueID
|
*cln.SQSQueueID = *eeOpts.SQSQueueID
|
||||||
}
|
}
|
||||||
|
if eeOpts.SQSForcePathStyle != nil {
|
||||||
|
cln.SQSForcePathStyle = new(bool)
|
||||||
|
*cln.SQSForcePathStyle = *eeOpts.SQSForcePathStyle
|
||||||
|
}
|
||||||
|
if eeOpts.SQSSkipTlsVerify != nil {
|
||||||
|
cln.SQSSkipTlsVerify = new(bool)
|
||||||
|
*cln.SQSSkipTlsVerify = *eeOpts.SQSSkipTlsVerify
|
||||||
|
}
|
||||||
if eeOpts.S3BucketID != nil {
|
if eeOpts.S3BucketID != nil {
|
||||||
cln.S3BucketID = new(string)
|
cln.S3BucketID = new(string)
|
||||||
*cln.S3BucketID = *eeOpts.S3BucketID
|
*cln.S3BucketID = *eeOpts.S3BucketID
|
||||||
@@ -813,6 +837,14 @@ func (eeOpts *EventExporterOpts) Clone() *EventExporterOpts {
|
|||||||
cln.S3FolderPath = new(string)
|
cln.S3FolderPath = new(string)
|
||||||
*cln.S3FolderPath = *eeOpts.S3FolderPath
|
*cln.S3FolderPath = *eeOpts.S3FolderPath
|
||||||
}
|
}
|
||||||
|
if eeOpts.S3ForcePathStyle != nil {
|
||||||
|
cln.S3ForcePathStyle = new(bool)
|
||||||
|
*cln.S3ForcePathStyle = *eeOpts.S3ForcePathStyle
|
||||||
|
}
|
||||||
|
if eeOpts.S3SkipTlsVerify != nil {
|
||||||
|
cln.S3SkipTlsVerify = new(bool)
|
||||||
|
*cln.S3SkipTlsVerify = *eeOpts.S3SkipTlsVerify
|
||||||
|
}
|
||||||
if eeOpts.NATSJetStream != nil {
|
if eeOpts.NATSJetStream != nil {
|
||||||
cln.NATSJetStream = new(bool)
|
cln.NATSJetStream = new(bool)
|
||||||
*cln.NATSJetStream = *eeOpts.NATSJetStream
|
*cln.NATSJetStream = *eeOpts.NATSJetStream
|
||||||
@@ -1119,12 +1151,24 @@ func (optsEes *EventExporterOpts) AsMapInterface() map[string]any {
|
|||||||
if optsEes.SQSQueueID != nil {
|
if optsEes.SQSQueueID != nil {
|
||||||
opts[utils.SQSQueueID] = *optsEes.SQSQueueID
|
opts[utils.SQSQueueID] = *optsEes.SQSQueueID
|
||||||
}
|
}
|
||||||
|
if optsEes.SQSForcePathStyle != nil {
|
||||||
|
opts[utils.SQSForcePathStyle] = *optsEes.SQSForcePathStyle
|
||||||
|
}
|
||||||
|
if optsEes.SQSSkipTlsVerify != nil {
|
||||||
|
opts[utils.SQSSkipTlsVerify] = *optsEes.SQSSkipTlsVerify
|
||||||
|
}
|
||||||
if optsEes.S3BucketID != nil {
|
if optsEes.S3BucketID != nil {
|
||||||
opts[utils.S3Bucket] = *optsEes.S3BucketID
|
opts[utils.S3Bucket] = *optsEes.S3BucketID
|
||||||
}
|
}
|
||||||
if optsEes.S3FolderPath != nil {
|
if optsEes.S3FolderPath != nil {
|
||||||
opts[utils.S3FolderPath] = *optsEes.S3FolderPath
|
opts[utils.S3FolderPath] = *optsEes.S3FolderPath
|
||||||
}
|
}
|
||||||
|
if optsEes.S3ForcePathStyle != nil {
|
||||||
|
opts[utils.S3ForcePathStyle] = *optsEes.S3ForcePathStyle
|
||||||
|
}
|
||||||
|
if optsEes.S3SkipTlsVerify != nil {
|
||||||
|
opts[utils.S3SkipTlsVerify] = *optsEes.S3SkipTlsVerify
|
||||||
|
}
|
||||||
if optsEes.NATSJetStream != nil {
|
if optsEes.NATSJetStream != nil {
|
||||||
opts[utils.NatsJetStream] = *optsEes.NATSJetStream
|
opts[utils.NatsJetStream] = *optsEes.NATSJetStream
|
||||||
}
|
}
|
||||||
@@ -1231,8 +1275,12 @@ type EventExporterOptsJson struct {
|
|||||||
AWSSecret *string `json:"awsSecret"`
|
AWSSecret *string `json:"awsSecret"`
|
||||||
AWSToken *string `json:"awsToken"`
|
AWSToken *string `json:"awsToken"`
|
||||||
SQSQueueID *string `json:"sqsQueueID"`
|
SQSQueueID *string `json:"sqsQueueID"`
|
||||||
|
SQSForcePathStyle *bool `json:"sqsForcePathStyle"`
|
||||||
|
SQSSkipTlsVerify *bool `json:"sqsSkipTlsVerify"`
|
||||||
S3BucketID *string `json:"s3BucketID"`
|
S3BucketID *string `json:"s3BucketID"`
|
||||||
S3FolderPath *string `json:"s3FolderPath"`
|
S3FolderPath *string `json:"s3FolderPath"`
|
||||||
|
S3ForcePathStyle *bool `json:"s3ForcePathStyle"`
|
||||||
|
S3SkipTlsVerify *bool `json:"s3SkipTlsVerify"`
|
||||||
NATSJetStream *bool `json:"natsJetStream"`
|
NATSJetStream *bool `json:"natsJetStream"`
|
||||||
NATSSubject *string `json:"natsSubject"`
|
NATSSubject *string `json:"natsSubject"`
|
||||||
NATSJWTFile *string `json:"natsJWTFile"`
|
NATSJWTFile *string `json:"natsJWTFile"`
|
||||||
@@ -1539,6 +1587,22 @@ func diffEventExporterOptsJsonCfg(d *EventExporterOptsJson, v1, v2 *EventExporte
|
|||||||
} else {
|
} else {
|
||||||
d.SQSQueueID = nil
|
d.SQSQueueID = nil
|
||||||
}
|
}
|
||||||
|
if v2.SQSForcePathStyle != nil {
|
||||||
|
if v1.SQSForcePathStyle == nil ||
|
||||||
|
*v1.SQSForcePathStyle != *v2.SQSForcePathStyle {
|
||||||
|
d.SQSForcePathStyle = v2.SQSForcePathStyle
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
d.SQSForcePathStyle = nil
|
||||||
|
}
|
||||||
|
if v2.SQSSkipTlsVerify != nil {
|
||||||
|
if v1.SQSSkipTlsVerify == nil ||
|
||||||
|
*v1.SQSSkipTlsVerify != *v2.SQSSkipTlsVerify {
|
||||||
|
d.SQSSkipTlsVerify = v2.SQSSkipTlsVerify
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
d.SQSSkipTlsVerify = nil
|
||||||
|
}
|
||||||
if v2.S3BucketID != nil {
|
if v2.S3BucketID != nil {
|
||||||
if v1.S3BucketID == nil ||
|
if v1.S3BucketID == nil ||
|
||||||
*v1.S3BucketID != *v2.S3BucketID {
|
*v1.S3BucketID != *v2.S3BucketID {
|
||||||
@@ -1555,6 +1619,22 @@ func diffEventExporterOptsJsonCfg(d *EventExporterOptsJson, v1, v2 *EventExporte
|
|||||||
} else {
|
} else {
|
||||||
d.S3FolderPath = nil
|
d.S3FolderPath = nil
|
||||||
}
|
}
|
||||||
|
if v2.S3ForcePathStyle != nil {
|
||||||
|
if v1.S3ForcePathStyle == nil ||
|
||||||
|
*v1.S3ForcePathStyle != *v2.S3ForcePathStyle {
|
||||||
|
d.S3ForcePathStyle = v2.S3ForcePathStyle
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
d.S3ForcePathStyle = nil
|
||||||
|
}
|
||||||
|
if v2.S3SkipTlsVerify != nil {
|
||||||
|
if v1.S3SkipTlsVerify == nil ||
|
||||||
|
*v1.S3SkipTlsVerify != *v2.S3SkipTlsVerify {
|
||||||
|
d.S3SkipTlsVerify = v2.S3SkipTlsVerify
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
d.S3SkipTlsVerify = nil
|
||||||
|
}
|
||||||
if v2.NATSJetStream != nil {
|
if v2.NATSJetStream != nil {
|
||||||
if v1.NATSJetStream == nil ||
|
if v1.NATSJetStream == nil ||
|
||||||
*v1.NATSJetStream != *v2.NATSJetStream {
|
*v1.NATSJetStream != *v2.NATSJetStream {
|
||||||
|
|||||||
@@ -1218,8 +1218,12 @@ func TestDiffEventExporterOptsJsonCfg(t *testing.T) {
|
|||||||
AWSSecret: utils.StringPointer("aws_secret"),
|
AWSSecret: utils.StringPointer("aws_secret"),
|
||||||
AWSToken: utils.StringPointer("aws_token"),
|
AWSToken: utils.StringPointer("aws_token"),
|
||||||
SQSQueueID: utils.StringPointer("sqs_queue_id"),
|
SQSQueueID: utils.StringPointer("sqs_queue_id"),
|
||||||
|
SQSForcePathStyle: utils.BoolPointer(true),
|
||||||
|
SQSSkipTlsVerify: utils.BoolPointer(true),
|
||||||
S3BucketID: utils.StringPointer("s3_bucket_id"),
|
S3BucketID: utils.StringPointer("s3_bucket_id"),
|
||||||
S3FolderPath: utils.StringPointer("s3_folder_path"),
|
S3FolderPath: utils.StringPointer("s3_folder_path"),
|
||||||
|
S3ForcePathStyle: utils.BoolPointer(true),
|
||||||
|
S3SkipTlsVerify: utils.BoolPointer(true),
|
||||||
NATSJetStream: utils.BoolPointer(false),
|
NATSJetStream: utils.BoolPointer(false),
|
||||||
NATSSubject: utils.StringPointer("ees_nats"),
|
NATSSubject: utils.StringPointer("ees_nats"),
|
||||||
NATSJWTFile: utils.StringPointer("/path/to/jwt"),
|
NATSJWTFile: utils.StringPointer("/path/to/jwt"),
|
||||||
@@ -1268,8 +1272,12 @@ func TestDiffEventExporterOptsJsonCfg(t *testing.T) {
|
|||||||
AWSSecret: utils.StringPointer("aws_secret"),
|
AWSSecret: utils.StringPointer("aws_secret"),
|
||||||
AWSToken: utils.StringPointer("aws_token"),
|
AWSToken: utils.StringPointer("aws_token"),
|
||||||
SQSQueueID: utils.StringPointer("sqs_queue_id"),
|
SQSQueueID: utils.StringPointer("sqs_queue_id"),
|
||||||
|
SQSForcePathStyle: utils.BoolPointer(true),
|
||||||
|
SQSSkipTlsVerify: utils.BoolPointer(true),
|
||||||
S3BucketID: utils.StringPointer("s3_bucket_id"),
|
S3BucketID: utils.StringPointer("s3_bucket_id"),
|
||||||
S3FolderPath: utils.StringPointer("s3_folder_path"),
|
S3FolderPath: utils.StringPointer("s3_folder_path"),
|
||||||
|
S3ForcePathStyle: utils.BoolPointer(true),
|
||||||
|
S3SkipTlsVerify: utils.BoolPointer(true),
|
||||||
NATSJetStream: utils.BoolPointer(false),
|
NATSJetStream: utils.BoolPointer(false),
|
||||||
NATSSubject: utils.StringPointer("ees_nats"),
|
NATSSubject: utils.StringPointer("ees_nats"),
|
||||||
NATSJWTFile: utils.StringPointer("/path/to/jwt"),
|
NATSJWTFile: utils.StringPointer("/path/to/jwt"),
|
||||||
@@ -1345,8 +1353,12 @@ func TestEventExporterOptsClone(t *testing.T) {
|
|||||||
AWSSecret: utils.StringPointer("aws_secret"),
|
AWSSecret: utils.StringPointer("aws_secret"),
|
||||||
AWSToken: utils.StringPointer("aws_token"),
|
AWSToken: utils.StringPointer("aws_token"),
|
||||||
SQSQueueID: utils.StringPointer("sqs_queue_id"),
|
SQSQueueID: utils.StringPointer("sqs_queue_id"),
|
||||||
|
SQSForcePathStyle: utils.BoolPointer(true),
|
||||||
|
SQSSkipTlsVerify: utils.BoolPointer(true),
|
||||||
S3BucketID: utils.StringPointer("s3_bucket_id"),
|
S3BucketID: utils.StringPointer("s3_bucket_id"),
|
||||||
S3FolderPath: utils.StringPointer("s3_folder_path"),
|
S3FolderPath: utils.StringPointer("s3_folder_path"),
|
||||||
|
S3ForcePathStyle: utils.BoolPointer(true),
|
||||||
|
S3SkipTlsVerify: utils.BoolPointer(true),
|
||||||
NATSJetStream: utils.BoolPointer(false),
|
NATSJetStream: utils.BoolPointer(false),
|
||||||
NATSSubject: utils.StringPointer("ees_nats"),
|
NATSSubject: utils.StringPointer("ees_nats"),
|
||||||
NATSJWTFile: utils.StringPointer("/path/to/jwt"),
|
NATSJWTFile: utils.StringPointer("/path/to/jwt"),
|
||||||
@@ -1397,8 +1409,12 @@ func TestEventExporterOptsClone(t *testing.T) {
|
|||||||
AWSSecret: utils.StringPointer("aws_secret"),
|
AWSSecret: utils.StringPointer("aws_secret"),
|
||||||
AWSToken: utils.StringPointer("aws_token"),
|
AWSToken: utils.StringPointer("aws_token"),
|
||||||
SQSQueueID: utils.StringPointer("sqs_queue_id"),
|
SQSQueueID: utils.StringPointer("sqs_queue_id"),
|
||||||
|
SQSForcePathStyle: utils.BoolPointer(true),
|
||||||
|
SQSSkipTlsVerify: utils.BoolPointer(true),
|
||||||
S3BucketID: utils.StringPointer("s3_bucket_id"),
|
S3BucketID: utils.StringPointer("s3_bucket_id"),
|
||||||
S3FolderPath: utils.StringPointer("s3_folder_path"),
|
S3FolderPath: utils.StringPointer("s3_folder_path"),
|
||||||
|
S3ForcePathStyle: utils.BoolPointer(true),
|
||||||
|
S3SkipTlsVerify: utils.BoolPointer(true),
|
||||||
NATSJetStream: utils.BoolPointer(false),
|
NATSJetStream: utils.BoolPointer(false),
|
||||||
NATSSubject: utils.StringPointer("ees_nats"),
|
NATSSubject: utils.StringPointer("ees_nats"),
|
||||||
NATSJWTFile: utils.StringPointer("/path/to/jwt"),
|
NATSJWTFile: utils.StringPointer("/path/to/jwt"),
|
||||||
@@ -1457,8 +1473,12 @@ func TestLoadFromJSONCfg(t *testing.T) {
|
|||||||
AWSSecret: utils.StringPointer("aws_secret"),
|
AWSSecret: utils.StringPointer("aws_secret"),
|
||||||
AWSToken: utils.StringPointer("aws_token"),
|
AWSToken: utils.StringPointer("aws_token"),
|
||||||
SQSQueueID: utils.StringPointer("sqs_queue_id"),
|
SQSQueueID: utils.StringPointer("sqs_queue_id"),
|
||||||
|
SQSForcePathStyle: utils.BoolPointer(true),
|
||||||
|
SQSSkipTlsVerify: utils.BoolPointer(true),
|
||||||
S3BucketID: utils.StringPointer("s3_bucket_id"),
|
S3BucketID: utils.StringPointer("s3_bucket_id"),
|
||||||
S3FolderPath: utils.StringPointer("s3_folder_path"),
|
S3FolderPath: utils.StringPointer("s3_folder_path"),
|
||||||
|
S3ForcePathStyle: utils.BoolPointer(true),
|
||||||
|
S3SkipTlsVerify: utils.BoolPointer(true),
|
||||||
NATSJetStream: utils.BoolPointer(false),
|
NATSJetStream: utils.BoolPointer(false),
|
||||||
NATSSubject: utils.StringPointer("ees_nats"),
|
NATSSubject: utils.StringPointer("ees_nats"),
|
||||||
NATSJWTFile: utils.StringPointer("/path/to/jwt"),
|
NATSJWTFile: utils.StringPointer("/path/to/jwt"),
|
||||||
@@ -1508,8 +1528,12 @@ func TestLoadFromJSONCfg(t *testing.T) {
|
|||||||
AWSSecret: utils.StringPointer("aws_secret"),
|
AWSSecret: utils.StringPointer("aws_secret"),
|
||||||
AWSToken: utils.StringPointer("aws_token"),
|
AWSToken: utils.StringPointer("aws_token"),
|
||||||
SQSQueueID: utils.StringPointer("sqs_queue_id"),
|
SQSQueueID: utils.StringPointer("sqs_queue_id"),
|
||||||
|
SQSForcePathStyle: utils.BoolPointer(true),
|
||||||
|
SQSSkipTlsVerify: utils.BoolPointer(true),
|
||||||
S3BucketID: utils.StringPointer("s3_bucket_id"),
|
S3BucketID: utils.StringPointer("s3_bucket_id"),
|
||||||
S3FolderPath: utils.StringPointer("s3_folder_path"),
|
S3FolderPath: utils.StringPointer("s3_folder_path"),
|
||||||
|
S3ForcePathStyle: utils.BoolPointer(true),
|
||||||
|
S3SkipTlsVerify: utils.BoolPointer(true),
|
||||||
NATSJetStream: utils.BoolPointer(false),
|
NATSJetStream: utils.BoolPointer(false),
|
||||||
NATSSubject: utils.StringPointer("ees_nats"),
|
NATSSubject: utils.StringPointer("ees_nats"),
|
||||||
NATSJWTFile: utils.StringPointer("/path/to/jwt"),
|
NATSJWTFile: utils.StringPointer("/path/to/jwt"),
|
||||||
@@ -1662,8 +1686,12 @@ func TestEEsAsMapInterface(t *testing.T) {
|
|||||||
AWSSecret: utils.StringPointer("aws_secret"),
|
AWSSecret: utils.StringPointer("aws_secret"),
|
||||||
AWSToken: utils.StringPointer("aws_token"),
|
AWSToken: utils.StringPointer("aws_token"),
|
||||||
SQSQueueID: utils.StringPointer("sqs_queue_id"),
|
SQSQueueID: utils.StringPointer("sqs_queue_id"),
|
||||||
|
SQSForcePathStyle: utils.BoolPointer(true),
|
||||||
|
SQSSkipTlsVerify: utils.BoolPointer(true),
|
||||||
S3BucketID: utils.StringPointer("s3_bucket_id"),
|
S3BucketID: utils.StringPointer("s3_bucket_id"),
|
||||||
S3FolderPath: utils.StringPointer("s3_folder_path"),
|
S3FolderPath: utils.StringPointer("s3_folder_path"),
|
||||||
|
S3ForcePathStyle: utils.BoolPointer(true),
|
||||||
|
S3SkipTlsVerify: utils.BoolPointer(true),
|
||||||
NATSJetStream: utils.BoolPointer(false),
|
NATSJetStream: utils.BoolPointer(false),
|
||||||
NATSSubject: utils.StringPointer("ees_nats"),
|
NATSSubject: utils.StringPointer("ees_nats"),
|
||||||
NATSJWTFile: utils.StringPointer("/path/to/jwt"),
|
NATSJWTFile: utils.StringPointer("/path/to/jwt"),
|
||||||
@@ -1725,6 +1753,8 @@ func TestEEsAsMapInterface(t *testing.T) {
|
|||||||
"rpcReplyTimeout": "2s",
|
"rpcReplyTimeout": "2s",
|
||||||
"s3BucketID": "s3_bucket_id",
|
"s3BucketID": "s3_bucket_id",
|
||||||
"s3FolderPath": "s3_folder_path",
|
"s3FolderPath": "s3_folder_path",
|
||||||
|
"s3ForcePathStyle": true,
|
||||||
|
"s3SkipTlsVerify": true,
|
||||||
"serviceMethod": "service_method",
|
"serviceMethod": "service_method",
|
||||||
"sqlConnMaxLifetime": "2s",
|
"sqlConnMaxLifetime": "2s",
|
||||||
"sqlDBName": "cgrates",
|
"sqlDBName": "cgrates",
|
||||||
@@ -1732,6 +1762,8 @@ func TestEEsAsMapInterface(t *testing.T) {
|
|||||||
"sqlMaxOpenConns": 10,
|
"sqlMaxOpenConns": 10,
|
||||||
"sqlTableName": "cdrs",
|
"sqlTableName": "cdrs",
|
||||||
"sqsQueueID": "sqs_queue_id",
|
"sqsQueueID": "sqs_queue_id",
|
||||||
|
"sqsForcePathStyle": true,
|
||||||
|
"sqsSkipTlsVerify": true,
|
||||||
"pgSSLMode": "sslm",
|
"pgSSLMode": "sslm",
|
||||||
"kafkaTLS": false,
|
"kafkaTLS": false,
|
||||||
"connIDs": []string{"testID"},
|
"connIDs": []string{"testID"},
|
||||||
@@ -1798,8 +1830,12 @@ func TestEescfgNewEventExporterCfg(t *testing.T) {
|
|||||||
AWSSecret: &str,
|
AWSSecret: &str,
|
||||||
AWSToken: &str,
|
AWSToken: &str,
|
||||||
SQSQueueID: &str,
|
SQSQueueID: &str,
|
||||||
|
SQSForcePathStyle: &bl,
|
||||||
|
SQSSkipTlsVerify: &bl,
|
||||||
S3BucketID: &str,
|
S3BucketID: &str,
|
||||||
S3FolderPath: &str,
|
S3FolderPath: &str,
|
||||||
|
S3ForcePathStyle: &bl,
|
||||||
|
S3SkipTlsVerify: &bl,
|
||||||
NATSJetStream: &bl,
|
NATSJetStream: &bl,
|
||||||
NATSSubject: &str,
|
NATSSubject: &str,
|
||||||
NATSJWTFile: &str,
|
NATSJWTFile: &str,
|
||||||
@@ -1902,8 +1938,12 @@ func TestEescfgloadFromJSONCfg(t *testing.T) {
|
|||||||
AWSSecret: &str,
|
AWSSecret: &str,
|
||||||
AWSToken: &str,
|
AWSToken: &str,
|
||||||
SQSQueueID: &str,
|
SQSQueueID: &str,
|
||||||
|
SQSForcePathStyle: &bl,
|
||||||
|
SQSSkipTlsVerify: &bl,
|
||||||
S3BucketID: &str,
|
S3BucketID: &str,
|
||||||
S3FolderPath: &str,
|
S3FolderPath: &str,
|
||||||
|
S3ForcePathStyle: &bl,
|
||||||
|
S3SkipTlsVerify: &bl,
|
||||||
NATSJetStream: &bl,
|
NATSJetStream: &bl,
|
||||||
NATSSubject: &str,
|
NATSSubject: &str,
|
||||||
NATSJWTFile: &str,
|
NATSJWTFile: &str,
|
||||||
@@ -1976,8 +2016,12 @@ func TestEescfgloadFromJSONCfg(t *testing.T) {
|
|||||||
AWSSecret: &str,
|
AWSSecret: &str,
|
||||||
AWSToken: &str,
|
AWSToken: &str,
|
||||||
SQSQueueID: &str,
|
SQSQueueID: &str,
|
||||||
|
SQSForcePathStyle: &bl,
|
||||||
|
SQSSkipTlsVerify: &bl,
|
||||||
S3BucketID: &str,
|
S3BucketID: &str,
|
||||||
S3FolderPath: &str,
|
S3FolderPath: &str,
|
||||||
|
S3ForcePathStyle: &bl,
|
||||||
|
S3SkipTlsVerify: &bl,
|
||||||
NATSJetStream: &bl,
|
NATSJetStream: &bl,
|
||||||
NATSSubject: &str,
|
NATSSubject: &str,
|
||||||
NATSJWTFile: &str,
|
NATSJWTFile: &str,
|
||||||
|
|||||||
@@ -58,6 +58,25 @@
|
|||||||
{"tag": "RequiredTemplate","type": "*template", "value": "requiredFields"}
|
{"tag": "RequiredTemplate","type": "*template", "value": "requiredFields"}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"id": "s3_nuantix_test_file",
|
||||||
|
"type": "*s3JSONMap",
|
||||||
|
"export_path": "s3.eu-central-1.amazonaws.com",
|
||||||
|
"opts": {
|
||||||
|
"awsRegion": "eu-central-1",
|
||||||
|
"awsKey": "access key ID",
|
||||||
|
"awsSecret": "secret access key",
|
||||||
|
"s3BucketID": "cgrates-cdrs",
|
||||||
|
"s3ForcePathStyle": true,
|
||||||
|
"s3SkipTlsVerify": true
|
||||||
|
},
|
||||||
|
"attempts": 1,
|
||||||
|
"failed_posts_dir": "/var/spool/cgrates/failed_posts2",
|
||||||
|
"synchronous": true,
|
||||||
|
"fields":[
|
||||||
|
{"tag": "RequiredTemplate","type": "*template", "value": "requiredFields"}
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"id": "amqpv1_test_file",
|
"id": "amqpv1_test_file",
|
||||||
"type": "*amqpv1JSONMap",
|
"type": "*amqpv1JSONMap",
|
||||||
|
|||||||
38
ees/s3.go
38
ees/s3.go
@@ -20,7 +20,9 @@ package ees
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"crypto/tls"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"net/http"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"github.com/aws/aws-sdk-go/aws"
|
"github.com/aws/aws-sdk-go/aws"
|
||||||
@@ -46,14 +48,16 @@ func NewS3EE(cfg *config.EventExporterCfg, em *utils.ExporterMetrics) *S3EE {
|
|||||||
|
|
||||||
// S3EE is a s3 poster
|
// S3EE is a s3 poster
|
||||||
type S3EE struct {
|
type S3EE struct {
|
||||||
awsRegion string
|
awsRegion string
|
||||||
awsID string
|
awsID string
|
||||||
awsKey string
|
awsKey string
|
||||||
awsToken string
|
awsToken string
|
||||||
bucket string
|
bucket string
|
||||||
folderPath string
|
folderPath string
|
||||||
session *session.Session
|
forcePathStyle bool
|
||||||
up *s3manager.Uploader
|
skipTlsVerify bool
|
||||||
|
session *session.Session
|
||||||
|
up *s3manager.Uploader
|
||||||
|
|
||||||
cfg *config.EventExporterCfg
|
cfg *config.EventExporterCfg
|
||||||
em *utils.ExporterMetrics
|
em *utils.ExporterMetrics
|
||||||
@@ -82,6 +86,12 @@ func (pstr *S3EE) parseOpts(opts *config.EventExporterOpts) {
|
|||||||
if opts.AWSToken != nil {
|
if opts.AWSToken != nil {
|
||||||
pstr.awsToken = *opts.AWSToken
|
pstr.awsToken = *opts.AWSToken
|
||||||
}
|
}
|
||||||
|
if opts.S3ForcePathStyle != nil {
|
||||||
|
pstr.forcePathStyle = *opts.S3ForcePathStyle
|
||||||
|
}
|
||||||
|
if opts.S3SkipTlsVerify != nil {
|
||||||
|
pstr.skipTlsVerify = *opts.S3SkipTlsVerify
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (pstr *S3EE) Cfg() *config.EventExporterCfg { return pstr.cfg }
|
func (pstr *S3EE) Cfg() *config.EventExporterCfg { return pstr.cfg }
|
||||||
@@ -98,6 +108,18 @@ func (pstr *S3EE) Connect() (err error) {
|
|||||||
len(pstr.awsKey) != 0 {
|
len(pstr.awsKey) != 0 {
|
||||||
cfg.Credentials = credentials.NewStaticCredentials(pstr.awsID, pstr.awsKey, pstr.awsToken)
|
cfg.Credentials = credentials.NewStaticCredentials(pstr.awsID, pstr.awsKey, pstr.awsToken)
|
||||||
}
|
}
|
||||||
|
if pstr.forcePathStyle {
|
||||||
|
cfg.S3ForcePathStyle = aws.Bool(true) // Required for custom S3-compatible endpoints
|
||||||
|
}
|
||||||
|
if pstr.skipTlsVerify {
|
||||||
|
cfg.HTTPClient = &http.Client{
|
||||||
|
Transport: &http.Transport{
|
||||||
|
TLSClientConfig: &tls.Config{
|
||||||
|
InsecureSkipVerify: true, // Equivalent to verify=False for self-signed certificates
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
pstr.session, err = session.NewSessionWithOptions(
|
pstr.session, err = session.NewSessionWithOptions(
|
||||||
session.Options{
|
session.Options{
|
||||||
Config: cfg,
|
Config: cfg,
|
||||||
|
|||||||
@@ -175,3 +175,112 @@ package ees
|
|||||||
// t.Errorf("Expected: %q, received: %q", expected, rply)
|
// t.Errorf("Expected: %q, received: %q", expected, rply)
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
// var (
|
||||||
|
// runS3NuantixTest = flag.Bool("nuantix", false, "Run the integration test for the S3 exporter from Nuantix")
|
||||||
|
|
||||||
|
// sTestsS3Nuantix = []func(t *testing.T){
|
||||||
|
// testS3LoadConfig,
|
||||||
|
// testS3ResetDataDB,
|
||||||
|
// testS3ResetStorDb,
|
||||||
|
// testS3StartEngine,
|
||||||
|
// testS3RPCConn,
|
||||||
|
// testS3NuantixExportEvent,
|
||||||
|
// testS3NuantixVerifyExport,
|
||||||
|
// testStopCgrEngine,
|
||||||
|
// }
|
||||||
|
// )
|
||||||
|
|
||||||
|
// func TestS3ExportNuantix(t *testing.T) {
|
||||||
|
// if !*runS3NuantixTest {
|
||||||
|
// t.SkipNow()
|
||||||
|
// }
|
||||||
|
// s3ConfDir = "ees_cloud"
|
||||||
|
// for _, stest := range sTestsS3Nuantix {
|
||||||
|
// t.Run(s3ConfDir, stest)
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// func testS3NuantixExportEvent(t *testing.T) {
|
||||||
|
// cgrID = utils.Sha1("abcdefg", time.Unix(1383813745, 0).UTC().String())
|
||||||
|
// t.Log(cgrID)
|
||||||
|
// ev := &engine.CGREventWithEeIDs{
|
||||||
|
// EeIDs: []string{"s3_nuantix_test_file"},
|
||||||
|
// CGREvent: &utils.CGREvent{
|
||||||
|
// Tenant: "cgrates.org",
|
||||||
|
// ID: "dataEvent",
|
||||||
|
// Time: utils.TimePointer(time.Now()),
|
||||||
|
// Event: map[string]any{
|
||||||
|
// utils.CGRID: cgrID,
|
||||||
|
// utils.ToR: utils.MetaData,
|
||||||
|
// utils.OriginID: "abcdefg",
|
||||||
|
// utils.OriginHost: "192.168.1.1",
|
||||||
|
// utils.RequestType: utils.MetaRated,
|
||||||
|
// utils.Tenant: "AnotherTenant",
|
||||||
|
// utils.Category: "call", //for data CDR use different Tenant
|
||||||
|
// utils.AccountField: "1001",
|
||||||
|
// utils.Subject: "1001",
|
||||||
|
// utils.Destination: "1002",
|
||||||
|
// utils.SetupTime: time.Unix(1383813745, 0).UTC(),
|
||||||
|
// utils.AnswerTime: time.Unix(1383813746, 0).UTC(),
|
||||||
|
// utils.Usage: 10 * time.Nanosecond,
|
||||||
|
// utils.RunID: utils.MetaDefault,
|
||||||
|
// utils.Cost: 0.012,
|
||||||
|
// },
|
||||||
|
// },
|
||||||
|
// }
|
||||||
|
|
||||||
|
// var reply map[string]utils.MapStorage
|
||||||
|
// if err := s3RPC.Call(context.Background(), utils.EeSv1ProcessEvent, ev, &reply); err != nil {
|
||||||
|
// t.Error(err)
|
||||||
|
// }
|
||||||
|
// time.Sleep(2 * time.Second)
|
||||||
|
// }
|
||||||
|
|
||||||
|
// func testS3NuantixVerifyExport(t *testing.T) {
|
||||||
|
// endpoint := "s3.eu-central-1.amazonaws.com"
|
||||||
|
// region := "eu-central-1"
|
||||||
|
// qname := "cgrates-cdrs"
|
||||||
|
|
||||||
|
// key := fmt.Sprintf("%s/%s:%s.json", "", cgrID, utils.MetaDefault)
|
||||||
|
|
||||||
|
// var sess *session.Session
|
||||||
|
// cfg := aws.Config{Endpoint: aws.String(endpoint)}
|
||||||
|
// cfg.Region = aws.String(region)
|
||||||
|
|
||||||
|
// cfg.Credentials = credentials.NewStaticCredentials(awsKey, awsSecret, "")
|
||||||
|
// var err error
|
||||||
|
// cfg.S3ForcePathStyle = aws.Bool(true)
|
||||||
|
// cfg.HTTPClient = &http.Client{
|
||||||
|
// Transport: &http.Transport{
|
||||||
|
// TLSClientConfig: &tls.Config{
|
||||||
|
// InsecureSkipVerify: true,
|
||||||
|
// },
|
||||||
|
// },
|
||||||
|
// }
|
||||||
|
// sess, err = session.NewSessionWithOptions(
|
||||||
|
// session.Options{
|
||||||
|
// Config: cfg,
|
||||||
|
// },
|
||||||
|
// )
|
||||||
|
// if err != nil {
|
||||||
|
// t.Error(err)
|
||||||
|
// }
|
||||||
|
// s3Clnt := s3.New(sess)
|
||||||
|
// s3Clnt.DeleteObject(&s3.DeleteObjectInput{})
|
||||||
|
// file := aws.NewWriteAtBuffer([]byte{})
|
||||||
|
// svc := s3manager.NewDownloader(sess)
|
||||||
|
|
||||||
|
// if _, err = svc.Download(file,
|
||||||
|
// &s3.GetObjectInput{
|
||||||
|
// Bucket: aws.String(qname),
|
||||||
|
// Key: aws.String(key),
|
||||||
|
// }); err != nil {
|
||||||
|
// t.Fatalf("Unable to download item %v", err)
|
||||||
|
// }
|
||||||
|
|
||||||
|
// expected := `{"Account":"1001","CGRID":"5a5ff7c40039976e1c2bd303dee45983267f6ed2","Category":"call","Destination":"1002","OriginID":"abcdefg","RequestType":"*rated","RunID":"*default","Subject":"1001","Tenant":"AnotherTenant","ToR":"*data"}`
|
||||||
|
// if rply := string(file.Bytes()); rply != expected {
|
||||||
|
// t.Errorf("Expected: %q, received: %q", expected, rply)
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|||||||
38
ees/sqs.go
38
ees/sqs.go
@@ -19,6 +19,8 @@ along with this program. If not, see <https://www.gnu.org/licenses/>
|
|||||||
package ees
|
package ees
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"crypto/tls"
|
||||||
|
"net/http"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"github.com/aws/aws-sdk-go/aws"
|
"github.com/aws/aws-sdk-go/aws"
|
||||||
@@ -44,14 +46,16 @@ func NewSQSee(cfg *config.EventExporterCfg, em *utils.ExporterMetrics) *SQSee {
|
|||||||
|
|
||||||
// SQSee is a poster for sqs
|
// SQSee is a poster for sqs
|
||||||
type SQSee struct {
|
type SQSee struct {
|
||||||
awsRegion string
|
awsRegion string
|
||||||
awsID string
|
awsID string
|
||||||
awsKey string
|
awsKey string
|
||||||
awsToken string
|
awsToken string
|
||||||
queueURL *string
|
queueURL *string
|
||||||
queueID string
|
queueID string
|
||||||
session *session.Session
|
forcePathStyle bool
|
||||||
svc *sqs.SQS
|
skipTlsVerify bool
|
||||||
|
session *session.Session
|
||||||
|
svc *sqs.SQS
|
||||||
|
|
||||||
cfg *config.EventExporterCfg
|
cfg *config.EventExporterCfg
|
||||||
em *utils.ExporterMetrics
|
em *utils.ExporterMetrics
|
||||||
@@ -77,6 +81,12 @@ func (pstr *SQSee) parseOpts(opts *config.EventExporterOpts) {
|
|||||||
if opts.AWSToken != nil {
|
if opts.AWSToken != nil {
|
||||||
pstr.awsToken = *opts.AWSToken
|
pstr.awsToken = *opts.AWSToken
|
||||||
}
|
}
|
||||||
|
if opts.SQSForcePathStyle != nil {
|
||||||
|
pstr.forcePathStyle = *opts.SQSForcePathStyle
|
||||||
|
}
|
||||||
|
if opts.SQSSkipTlsVerify != nil {
|
||||||
|
pstr.skipTlsVerify = *opts.SQSSkipTlsVerify
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (pstr *SQSee) Cfg() *config.EventExporterCfg { return pstr.cfg }
|
func (pstr *SQSee) Cfg() *config.EventExporterCfg { return pstr.cfg }
|
||||||
@@ -93,6 +103,18 @@ func (pstr *SQSee) Connect() (err error) {
|
|||||||
len(pstr.awsKey) != 0 {
|
len(pstr.awsKey) != 0 {
|
||||||
cfg.Credentials = credentials.NewStaticCredentials(pstr.awsID, pstr.awsKey, pstr.awsToken)
|
cfg.Credentials = credentials.NewStaticCredentials(pstr.awsID, pstr.awsKey, pstr.awsToken)
|
||||||
}
|
}
|
||||||
|
if pstr.forcePathStyle {
|
||||||
|
cfg.S3ForcePathStyle = aws.Bool(true) // Required for custom S3-compatible endpoints
|
||||||
|
}
|
||||||
|
if pstr.skipTlsVerify {
|
||||||
|
cfg.HTTPClient = &http.Client{
|
||||||
|
Transport: &http.Transport{
|
||||||
|
TLSClientConfig: &tls.Config{
|
||||||
|
InsecureSkipVerify: true, // Equivalent to verify=False for self-signed certificates
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
pstr.session, err = session.NewSessionWithOptions(
|
pstr.session, err = session.NewSessionWithOptions(
|
||||||
session.Options{
|
session.Options{
|
||||||
Config: cfg,
|
Config: cfg,
|
||||||
|
|||||||
@@ -2863,11 +2863,15 @@ const (
|
|||||||
AWSToken = "awsToken"
|
AWSToken = "awsToken"
|
||||||
|
|
||||||
// sqs
|
// sqs
|
||||||
SQSQueueID = "sqsQueueID"
|
SQSQueueID = "sqsQueueID"
|
||||||
|
SQSForcePathStyle = "sqsForcePathStyle"
|
||||||
|
SQSSkipTlsVerify = "sqsSkipTlsVerify"
|
||||||
|
|
||||||
// s3
|
// s3
|
||||||
S3Bucket = "s3BucketID"
|
S3Bucket = "s3BucketID"
|
||||||
S3FolderPath = "s3FolderPath"
|
S3FolderPath = "s3FolderPath"
|
||||||
|
S3ForcePathStyle = "s3ForcePathStyle"
|
||||||
|
S3SkipTlsVerify = "s3SkipTlsVerify"
|
||||||
|
|
||||||
// sql
|
// sql
|
||||||
SQLDefaultDBName = "cgrates"
|
SQLDefaultDBName = "cgrates"
|
||||||
|
|||||||
Reference in New Issue
Block a user