mirror of
https://github.com/cgrates/cgrates.git
synced 2026-02-14 20:59:53 +05:00
ApierV2.ExportTPToFolder
This commit is contained in:
@@ -21,6 +21,7 @@ package v2
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/cgrates/cgrates/engine"
|
||||
"github.com/cgrates/cgrates/utils"
|
||||
)
|
||||
|
||||
@@ -33,6 +34,31 @@ func (self *ApierV2) RemTP(tpid string, reply *string) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (self *ApierV2) ExportTPToFolder(attrs utils.AttrDirExportTP, exported *utils.DirExportedTP) error {
|
||||
func (self *ApierV2) ExportTPToFolder(attrs utils.AttrDirExportTP, exported *utils.ExportedTPStats) error {
|
||||
if len(*attrs.TPid) == 0 {
|
||||
return fmt.Errorf("%s:TPid", utils.ERR_MANDATORY_IE_MISSING)
|
||||
}
|
||||
dir := ""
|
||||
if attrs.ExportDir != nil {
|
||||
dir = *attrs.ExportDir
|
||||
}
|
||||
fileFormat := ""
|
||||
if attrs.FileFormat != nil {
|
||||
fileFormat = *attrs.FileFormat
|
||||
}
|
||||
sep := ""
|
||||
if attrs.FieldSeparator != nil {
|
||||
sep = *attrs.FieldSeparator
|
||||
}
|
||||
tpExporter, err := engine.NewTPExporter(self.StorDb, *attrs.TPid, dir, fileFormat, sep, nil)
|
||||
if err != nil {
|
||||
return fmt.Errorf("%s:%s", utils.ERR_SERVER_ERROR, err.Error())
|
||||
}
|
||||
if err := tpExporter.Run(); err != nil {
|
||||
return fmt.Errorf("%s:%s", utils.ERR_SERVER_ERROR, err.Error())
|
||||
} else {
|
||||
*exported = *tpExporter.ExportStats()
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -14,25 +14,25 @@ accountdb_port = test # Accounting subsystem port to reach the database.
|
||||
accountdb_name = test # Accounting subsystem database name to connect to.
|
||||
accountdb_user = test # Accounting subsystem username to use when connecting to database.
|
||||
accountdb_passwd = test # Accounting subsystem password to use when connecting to database.
|
||||
stordb_type = test # Log/scategoryed database type to use: <same|postgres|mongo|redis>
|
||||
stordb_host = test # The host to connect to. Values that start with / are for UNIX domain sockets.
|
||||
stordb_port = test # The port to reach the logdb.
|
||||
stordb_name = test # The name of the log database to connect to.
|
||||
stordb_type = test # Log/scategoryed database type to use: <same|postgres|mongo|redis>
|
||||
stordb_host = test # The host to connect to. Values that start with / are for UNIX domain sockets.
|
||||
stordb_port = test # The port to reach the logdb.
|
||||
stordb_name = test # The name of the log database to connect to.
|
||||
stordb_user = test # Username to use when connecting to logdb.
|
||||
stordb_passwd = test # Password to use when connecting to logdb.
|
||||
stordb_max_open_conns = 99 # Maximum database connections opened
|
||||
stordb_max_idle_conns = 99 # Maximum database connections idle
|
||||
stordb_max_open_conns = 99 # Maximum database connections opened
|
||||
stordb_max_idle_conns = 99 # Maximum database connections idle
|
||||
dbdata_encoding = test # The encoding used to scategorye object data in strings: <msgpack|json>
|
||||
rpc_json_listen = test # RPC JSON listening address
|
||||
rpc_gob_listen = test # RPC GOB listening address
|
||||
http_listen = test # HTTP listening address
|
||||
http_listen = TEST # HTTP listening address
|
||||
default_reqtype = test # Default request type to consider when missing from requests: <""|prepaid|postpaid|pseudoprepaid|rated>.
|
||||
default_category = test # Default Type of Record to consider when missing from requests.
|
||||
default_tenant = test # Default Tenant to consider when missing from requests.
|
||||
default_subject = test # Default rating Subject to consider when missing from requests.
|
||||
rounding_decimals = 99 # Number of decimals to round floats/costs at
|
||||
http_skip_tls_veify = true # If enabled Http Client will accept any TLS certificate
|
||||
tpexport_dir = test # Path towards export folder for offline Tariff Plans
|
||||
tpexport_dir = test # Path towards export folder for offline Tariff Plans
|
||||
|
||||
[balancer]
|
||||
enabled = true # Start Balancer service: <true|false>.
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
# rounding_decimals = 10 # System level precision for floats
|
||||
# http_skip_tls_veify = false # If enabled Http Client will accept any TLS certificate
|
||||
# tpexport_dir = /var/log/cgrates/tpe # Path towards export folder for offline Tariff Plans
|
||||
# xmlcfg_path = # Path towards additional config defined in xml file
|
||||
# xmlcfg_path = # Path towards additional config defined in xml file
|
||||
|
||||
[balancer]
|
||||
# enabled = false # Start Balancer service: <true|false>.
|
||||
|
||||
@@ -27,6 +27,7 @@ import (
|
||||
"path"
|
||||
"unicode/utf8"
|
||||
|
||||
"github.com/cgrates/cgrates/config"
|
||||
"github.com/cgrates/cgrates/utils"
|
||||
)
|
||||
|
||||
@@ -37,6 +38,18 @@ var (
|
||||
)
|
||||
|
||||
func NewTPExporter(storDb LoadStorage, tpID, dir, fileFormat, sep string, dryRunBuff *bytes.Buffer) (*TPExporter, error) {
|
||||
if len(tpID) == 0 {
|
||||
return nil, errors.New("Missing TPid")
|
||||
}
|
||||
if len(dir) == 0 {
|
||||
dir = config.CgrConfig().TpExportDir
|
||||
}
|
||||
if len(fileFormat) == 0 {
|
||||
fileFormat = utils.CSV
|
||||
}
|
||||
if len(sep) == 0 {
|
||||
sep = ","
|
||||
}
|
||||
if !utils.IsSliceMember(TPExportFormats, fileFormat) {
|
||||
return nil, errors.New("Unsupported file format")
|
||||
}
|
||||
@@ -58,15 +71,17 @@ func NewTPExporter(storDb LoadStorage, tpID, dir, fileFormat, sep string, dryRun
|
||||
|
||||
// Export TariffPlan to a folder
|
||||
type TPExporter struct {
|
||||
storDb LoadStorage // StorDb connection handle
|
||||
tpID string // Load data on this tpid
|
||||
dirPath string // Directory path to export to
|
||||
fileFormat string // The file format <csv>
|
||||
sep rune // Separator in the csv file
|
||||
dryRunBuffer *bytes.Buffer // Will be written in case of dryRun so we can read it from tests
|
||||
storDb LoadStorage // StorDb connection handle
|
||||
tpID string // Load data on this tpid
|
||||
dirPath string // Directory path to export to
|
||||
fileFormat string // The file format <csv>
|
||||
sep rune // Separator in the csv file
|
||||
dryRunBuffer *bytes.Buffer // Will be written in case of dryRun so we can read it from tests
|
||||
exportedFiles []string
|
||||
}
|
||||
|
||||
func (self *TPExporter) Run() error {
|
||||
self.removeFiles() // Make sure we clean the folder before starting with new one
|
||||
for _, fHandler := range []func() error{
|
||||
self.exportTimings,
|
||||
self.exportDestinations,
|
||||
@@ -100,6 +115,9 @@ func (self *TPExporter) removeFiles() error {
|
||||
|
||||
// General method to write the content out to a file
|
||||
func (self *TPExporter) writeOut(fileName string, tpData []utils.ExportedData) error {
|
||||
if len(tpData) == 0 {
|
||||
return nil
|
||||
}
|
||||
var writerOut utils.CgrRecordWriter
|
||||
if self.fileFormat == utils.DRYRUN {
|
||||
writerOut = utils.NewCgrIORecordWriter(self.dryRunBuffer)
|
||||
@@ -120,6 +138,7 @@ func (self *TPExporter) writeOut(fileName string, tpData []utils.ExportedData) e
|
||||
}
|
||||
}
|
||||
}
|
||||
writerOut.Flush()
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -138,6 +157,7 @@ func (self *TPExporter) exportTimings() error {
|
||||
if err := self.writeOut(fileName, exportedData); err != nil {
|
||||
return err
|
||||
}
|
||||
self.exportedFiles = append(self.exportedFiles, fileName)
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -156,6 +176,7 @@ func (self *TPExporter) exportDestinations() error {
|
||||
if err := self.writeOut(fileName, exportedData); err != nil {
|
||||
return err
|
||||
}
|
||||
self.exportedFiles = append(self.exportedFiles, fileName)
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -174,6 +195,7 @@ func (self *TPExporter) exportRates() error {
|
||||
if err := self.writeOut(fileName, exportedData); err != nil {
|
||||
return err
|
||||
}
|
||||
self.exportedFiles = append(self.exportedFiles, fileName)
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -192,6 +214,7 @@ func (self *TPExporter) exportDestinationRates() error {
|
||||
if err := self.writeOut(fileName, exportedData); err != nil {
|
||||
return err
|
||||
}
|
||||
self.exportedFiles = append(self.exportedFiles, fileName)
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -210,6 +233,7 @@ func (self *TPExporter) exportRatingPlans() error {
|
||||
if err := self.writeOut(fileName, exportedData); err != nil {
|
||||
return err
|
||||
}
|
||||
self.exportedFiles = append(self.exportedFiles, fileName)
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -228,6 +252,7 @@ func (self *TPExporter) exportRatingProfiles() error {
|
||||
if err := self.writeOut(fileName, exportedData); err != nil {
|
||||
return err
|
||||
}
|
||||
self.exportedFiles = append(self.exportedFiles, fileName)
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -246,6 +271,7 @@ func (self *TPExporter) exportSharedGroups() error {
|
||||
if err := self.writeOut(fileName, exportedData); err != nil {
|
||||
return err
|
||||
}
|
||||
self.exportedFiles = append(self.exportedFiles, fileName)
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -264,6 +290,7 @@ func (self *TPExporter) exportActions() error {
|
||||
if err := self.writeOut(fileName, exportedData); err != nil {
|
||||
return err
|
||||
}
|
||||
self.exportedFiles = append(self.exportedFiles, fileName)
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -282,6 +309,7 @@ func (self *TPExporter) exportActionPlans() error {
|
||||
if err := self.writeOut(fileName, exportedData); err != nil {
|
||||
return err
|
||||
}
|
||||
self.exportedFiles = append(self.exportedFiles, fileName)
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -300,6 +328,7 @@ func (self *TPExporter) exportActionTriggers() error {
|
||||
if err := self.writeOut(fileName, exportedData); err != nil {
|
||||
return err
|
||||
}
|
||||
self.exportedFiles = append(self.exportedFiles, fileName)
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -318,6 +347,7 @@ func (self *TPExporter) exportAccountActions() error {
|
||||
if err := self.writeOut(fileName, exportedData); err != nil {
|
||||
return err
|
||||
}
|
||||
self.exportedFiles = append(self.exportedFiles, fileName)
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -336,6 +366,7 @@ func (self *TPExporter) exportDerivedChargers() error {
|
||||
if err := self.writeOut(fileName, exportedData); err != nil {
|
||||
return err
|
||||
}
|
||||
self.exportedFiles = append(self.exportedFiles, fileName)
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -354,5 +385,10 @@ func (self *TPExporter) exportCdrStats() error {
|
||||
if err := self.writeOut(fileName, exportedData); err != nil {
|
||||
return err
|
||||
}
|
||||
self.exportedFiles = append(self.exportedFiles, fileName)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (self *TPExporter) ExportStats() *utils.ExportedTPStats {
|
||||
return &utils.ExportedTPStats{ExportDir: self.dirPath, ExportedFiles: self.exportedFiles}
|
||||
}
|
||||
|
||||
@@ -782,9 +782,10 @@ type AttrDirExportTP struct {
|
||||
FileFormat *string // Format of the exported file <csv>
|
||||
FieldSeparator *string // Separator used between fields
|
||||
ExportDir *string // If provided it overwrites the configured export directory
|
||||
Compress *bool // If true the folder will be compressed after export performed
|
||||
}
|
||||
|
||||
type DirExportedTP struct {
|
||||
type ExportedTPStats struct {
|
||||
ExportDir string // Full path to the newly generated export file
|
||||
ExportedFiles []string // List of exported files
|
||||
}
|
||||
|
||||
@@ -25,6 +25,7 @@ import (
|
||||
// Writer for one line, compatible with csv.Writer interface on Write
|
||||
type CgrRecordWriter interface {
|
||||
Write([]string) error
|
||||
Flush()
|
||||
}
|
||||
|
||||
func NewCgrIORecordWriter(w io.Writer) *CgrIORecordWriter {
|
||||
@@ -43,3 +44,8 @@ func (self *CgrIORecordWriter) Write(record []string) error {
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// ToDo: make sure we properly handle this method
|
||||
func (self *CgrIORecordWriter) Flush() {
|
||||
return
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user