diff --git a/apier/v1/sessions.go b/apier/v1/sessions.go index d80ba2c07..ddb9fc833 100644 --- a/apier/v1/sessions.go +++ b/apier/v1/sessions.go @@ -36,15 +36,16 @@ type SessionSv1 struct { // Publishes BiJSONRPC methods exported by SessionSv1 func (ssv1 *SessionSv1) Handlers() map[string]interface{} { return map[string]interface{}{ - utils.SessionSv1AuthorizeEvent: ssv1.BiRpcAuthorizeEvent, - utils.SessionSv1AuthorizeEventWithDigest: ssv1.BiRpcAuthorizeEventWithDigest, - utils.SessionSv1InitiateSession: ssv1.BiRpcInitiateSession, - utils.SessionSv1UpdateSession: ssv1.BiRpcUpdateSession, - utils.SessionSv1TerminateSession: ssv1.BiRpcTerminateSession, - utils.SessionSv1ProcessCDR: ssv1.BiRpcProcessCDR, - utils.SessionSv1ProcessEvent: ssv1.BiRpcProcessEvent, - utils.SessionSv1GetActiveSessions: ssv1.BiRPCV1GetActiveSessions, - utils.SessionSv1GetPassiveSessions: ssv1.BiRPCV1GetPassiveSessions, + utils.SessionSv1AuthorizeEvent: ssv1.BiRpcAuthorizeEvent, + utils.SessionSv1AuthorizeEventWithDigest: ssv1.BiRpcAuthorizeEventWithDigest, + utils.SessionSv1InitiateSession: ssv1.BiRpcInitiateSession, + utils.SessionSv1InitiateSessionWithDigest: ssv1.BiRpcInitiateSessionWithDigest, + utils.SessionSv1UpdateSession: ssv1.BiRpcUpdateSession, + utils.SessionSv1TerminateSession: ssv1.BiRpcTerminateSession, + utils.SessionSv1ProcessCDR: ssv1.BiRpcProcessCDR, + utils.SessionSv1ProcessEvent: ssv1.BiRpcProcessEvent, + utils.SessionSv1GetActiveSessions: ssv1.BiRPCV1GetActiveSessions, + utils.SessionSv1GetPassiveSessions: ssv1.BiRPCV1GetPassiveSessions, } } @@ -63,6 +64,11 @@ func (ssv1 *SessionSv1) InitiateSession(args *sessions.V1InitSessionArgs, return ssv1.SMG.BiRPCv1InitiateSession(nil, args, rply) } +func (ssv1 *SessionSv1) InitiateSessionWithDigest(args *sessions.V1InitSessionArgs, + rply *sessions.V1InitReplyWithDigest) error { + return ssv1.SMG.BiRPCv1InitiateSessionWithDigest(nil, args, rply) +} + func (ssv1 *SessionSv1) UpdateSession(args *sessions.V1UpdateSessionArgs, rply *sessions.V1UpdateSessionReply) error { return ssv1.SMG.BiRPCv1UpdateSession(nil, args, rply) @@ -105,6 +111,11 @@ func (ssv1 *SessionSv1) BiRpcInitiateSession(clnt *rpc2.Client, args *sessions.V return ssv1.SMG.BiRPCv1InitiateSession(clnt, args, rply) } +func (ssv1 *SessionSv1) BiRpcInitiateSessionWithDigest(clnt *rpc2.Client, args *sessions.V1InitSessionArgs, + rply *sessions.V1InitReplyWithDigest) error { + return ssv1.SMG.BiRPCv1InitiateSessionWithDigest(clnt, args, rply) +} + func (ssv1 *SessionSv1) BiRpcUpdateSession(clnt *rpc2.Client, args *sessions.V1UpdateSessionArgs, rply *sessions.V1UpdateSessionReply) error { return ssv1.SMG.BiRPCv1UpdateSession(clnt, args, rply) diff --git a/apier/v1/sessionsv1_it_test.go b/apier/v1/sessionsv1_it_test.go index 480c307e2..8af7af406 100644 --- a/apier/v1/sessionsv1_it_test.go +++ b/apier/v1/sessionsv1_it_test.go @@ -282,6 +282,44 @@ func TestSSv1ItInitiateSession(t *testing.T) { } } +func TestSSv1ItInitiateSessionWithDigest(t *testing.T) { + initUsage := time.Duration(5 * time.Minute) + args := &sessions.V1InitSessionArgs{ + InitSession: true, + AllocateResources: true, + GetAttributes: true, + CGREvent: utils.CGREvent{ + Tenant: "cgrates.org", + ID: "TestSSv1ItInitiateSession", + Event: map[string]interface{}{ + utils.OriginID: "TestSSv1It1", + utils.RequestType: utils.META_PREPAID, + utils.Account: "1001", + utils.Destination: "1002", + utils.SetupTime: time.Date(2018, time.January, 7, 16, 60, 0, 0, time.UTC), + utils.AnswerTime: time.Date(2018, time.January, 7, 16, 60, 10, 0, time.UTC), + utils.Usage: initUsage, + }, + }, + } + var rply sessions.V1InitReplyWithDigest + if err := sSv1BiRpc.Call(utils.SessionSv1InitiateSessionWithDigest, + args, &rply); err != nil { + t.Error(err) + } + if *rply.MaxUsage != initUsage.Seconds() { + t.Errorf("Unexpected MaxUsage: %v", rply.MaxUsage) + } + if *rply.ResourceAllocation != "RES_ACNT_1001" { + t.Errorf("Unexpected ResourceAllocation: %s", *rply.ResourceAllocation) + } + eAttrs := utils.StringPointer("OfficeGroup:Marketing") + if !reflect.DeepEqual(eAttrs, rply.AttributesDigest) { + t.Errorf("expecting: %+v, received: %+v", + utils.ToJSON(eAttrs), utils.ToJSON(rply.AttributesDigest)) + } +} + func TestSSv1ItUpdateSession(t *testing.T) { reqUsage := 5 * time.Minute args := &sessions.V1UpdateSessionArgs{ diff --git a/cmd/cgr-migrator/cgr-migrator.go b/cmd/cgr-migrator/cgr-migrator.go index 0c6c743cd..263ebfee2 100755 --- a/cmd/cgr-migrator/cgr-migrator.go +++ b/cmd/cgr-migrator/cgr-migrator.go @@ -107,67 +107,67 @@ func main() { return } - ldrCfg := config.CgrConfig() + mgrCfg := config.CgrConfig() if *inDataDBType != dfltCfg.DataDbType { - ldrCfg.DataDbType = *inDataDBType + mgrCfg.DataDbType = *inDataDBType } if *inDataDBHost != dfltCfg.DataDbHost { - ldrCfg.DataDbHost = *inDataDBHost + mgrCfg.DataDbHost = *inDataDBHost } if *inDataDBPort != dfltCfg.DataDbPort { - ldrCfg.DataDbPort = *inDataDBPort + mgrCfg.DataDbPort = *inDataDBPort } if *inDataDBName != dfltCfg.DataDbName { - ldrCfg.DataDbName = *inDataDBName + mgrCfg.DataDbName = *inDataDBName } if *inDataDBUser != dfltCfg.DataDbUser { - ldrCfg.DataDbUser = *inDataDBUser + mgrCfg.DataDbUser = *inDataDBUser } if *inDataDBPass != dfltCfg.DataDbPass { - ldrCfg.DataDbPass = *inDataDBPass + mgrCfg.DataDbPass = *inDataDBPass } if *inStorDBType != dfltCfg.StorDBType { - ldrCfg.StorDBType = *inStorDBType + mgrCfg.StorDBType = *inStorDBType } if *inStorDBHost != dfltCfg.StorDBHost { - ldrCfg.StorDBHost = *inStorDBHost + mgrCfg.StorDBHost = *inStorDBHost } if *inStorDBPort != dfltCfg.StorDBPort { - ldrCfg.StorDBPort = *inStorDBPort + mgrCfg.StorDBPort = *inStorDBPort } if *inStorDBName != dfltCfg.StorDBName { - ldrCfg.StorDBName = *inStorDBName + mgrCfg.StorDBName = *inStorDBName } if *inStorDBUser != dfltCfg.StorDBUser { - ldrCfg.StorDBUser = *inStorDBUser + mgrCfg.StorDBUser = *inStorDBUser } if *inStorDBPass != "" { - ldrCfg.StorDBPass = *inStorDBPass + mgrCfg.StorDBPass = *inStorDBPass } if *inDBDataEncoding != "" { - ldrCfg.DBDataEncoding = *inDBDataEncoding + mgrCfg.DBDataEncoding = *inDBDataEncoding } if *outDataDBType == utils.MetaDynamic { - *outDataDBType = ldrCfg.DataDbType - *outDataDBHost = ldrCfg.DataDbHost - *outDataDBPort = ldrCfg.DataDbPort - *outDataDBName = ldrCfg.DataDbName - *outDataDBUser = ldrCfg.DataDbUser - *outDataDBPass = ldrCfg.DataDbPass + *outDataDBType = mgrCfg.DataDbType + *outDataDBHost = mgrCfg.DataDbHost + *outDataDBPort = mgrCfg.DataDbPort + *outDataDBName = mgrCfg.DataDbName + *outDataDBUser = mgrCfg.DataDbUser + *outDataDBPass = mgrCfg.DataDbPass } else { *outDataDBType = strings.TrimPrefix(*outDataDBType, "*") *outDataDBHost = config.DBDefaults.DBHost(*outDataDBType, *outDataDBHost) @@ -186,25 +186,25 @@ func main() { *outStorDBPass = config.DBDefaults.DBPass(*outStorDBType, *outStorDBPass) } - if dmIN, err = engine.ConfigureDataStorage(ldrCfg.DataDbType, ldrCfg.DataDbHost, ldrCfg.DataDbPort, - ldrCfg.DataDbName, ldrCfg.DataDbUser, ldrCfg.DataDbPass, ldrCfg.DBDataEncoding, + if dmIN, err = engine.ConfigureDataStorage(mgrCfg.DataDbType, mgrCfg.DataDbHost, mgrCfg.DataDbPort, + mgrCfg.DataDbName, mgrCfg.DataDbUser, mgrCfg.DataDbPass, mgrCfg.DBDataEncoding, config.CgrConfig().CacheCfg(), 0); err != nil { log.Fatal(err) } - if instorDB, err = engine.ConfigureStorDB(ldrCfg.StorDBType, ldrCfg.StorDBHost, ldrCfg.StorDBPort, - ldrCfg.StorDBName, ldrCfg.StorDBUser, ldrCfg.StorDBPass, + if instorDB, err = engine.ConfigureStorDB(mgrCfg.StorDBType, mgrCfg.StorDBHost, mgrCfg.StorDBPort, + mgrCfg.StorDBName, mgrCfg.StorDBUser, mgrCfg.StorDBPass, config.CgrConfig().StorDBMaxOpenConns, config.CgrConfig().StorDBMaxIdleConns, config.CgrConfig().StorDBConnMaxLifetime, config.CgrConfig().StorDBCDRSIndexes); err != nil { log.Fatal(err) } if dmOUT, err = engine.ConfigureDataStorage(*outDataDBType, *outDataDBHost, *outDataDBPort, - *outDataDBName, *outDataDBUser, *outDataDBPass, ldrCfg.DBDataEncoding, + *outDataDBName, *outDataDBUser, *outDataDBPass, mgrCfg.DBDataEncoding, config.CgrConfig().CacheCfg(), 0); err != nil { log.Fatal(err) } if outDataDB, err = migrator.ConfigureV1DataStorage(*outDataDBType, *outDataDBHost, *outDataDBPort, - *outDataDBName, *outDataDBUser, *outDataDBPass, ldrCfg.DBDataEncoding); err != nil { + *outDataDBName, *outDataDBUser, *outDataDBPass, mgrCfg.DBDataEncoding); err != nil { log.Fatal(err) } @@ -217,14 +217,14 @@ func main() { log.Fatal(err) } } - if ldrCfg.DataDbName != *outDataDBName || ldrCfg.DataDbType != *outDataDBType || ldrCfg.DataDbHost != *outDataDBHost { + if mgrCfg.DataDbName != *outDataDBName || mgrCfg.DataDbType != *outDataDBType || mgrCfg.DataDbHost != *outDataDBHost { sameDataDB = false } - if ldrCfg.StorDBName != *outStorDBName || ldrCfg.StorDBType != *outStorDBName || ldrCfg.StorDBHost != *outStorDBHost { + if mgrCfg.StorDBName != *outStorDBName || mgrCfg.StorDBType != *outStorDBName || mgrCfg.StorDBHost != *outStorDBHost { sameStorDB = false } - m, err := migrator.NewMigrator(dmIN, dmOUT, ldrCfg.DataDbType, ldrCfg.DBDataEncoding, storDB, ldrCfg.StorDBType, outDataDB, - *outDataDBType, ldrCfg.DBDataEncoding, instorDB, *outStorDBType, *dryRun, sameDataDB, sameStorDB, *datadb_versions, *stordb_versions) + m, err := migrator.NewMigrator(dmIN, dmOUT, mgrCfg.DataDbType, mgrCfg.DBDataEncoding, storDB, mgrCfg.StorDBType, outDataDB, + *outDataDBType, mgrCfg.DBDataEncoding, instorDB, *outStorDBType, *dryRun, sameDataDB, sameStorDB, *datadb_versions, *stordb_versions) if err != nil { log.Fatal(err) } diff --git a/console/session_initiate.go b/console/session_initiate.go index ccc9cd7d4..44a3e5245 100644 --- a/console/session_initiate.go +++ b/console/session_initiate.go @@ -28,7 +28,7 @@ import ( func init() { c := &CmdSessionsInitiate{ name: "session_initiate", - rpcMethod: utils.SessionSv1InitiateSession, + rpcMethod: utils.SessionSv1InitiateSessionWithDigest, rpcParams: &sessions.V1InitSessionArgs{}, } commands[c.Name()] = c diff --git a/sessions/sessions.go b/sessions/sessions.go index d8a2ef44a..8624210c7 100644 --- a/sessions/sessions.go +++ b/sessions/sessions.go @@ -1643,6 +1643,42 @@ func (smg *SMGeneric) BiRPCv1InitiateSession(clnt rpcclient.RpcClientConnection, return } +type V1InitReplyWithDigest struct { + AttributesDigest *string + ResourceAllocation *string + MaxUsage *float64 + //ThresholdsHits *int +} + +func (smg *SMGeneric) BiRPCv1InitiateSessionWithDigest(clnt rpcclient.RpcClientConnection, + args *V1InitSessionArgs, initReply *V1InitReplyWithDigest) (err error) { + if !args.GetAttributes && !args.AllocateResources && + !args.InitSession { + return utils.NewErrMandatoryIeMissing("subsystems") + } + var initSessionRply V1InitSessionReply + if err = smg.BiRPCv1InitiateSession(clnt, args, &initSessionRply); err != nil { + return + } + + if args.GetAttributes && initSessionRply.Attributes != nil { + initReply.AttributesDigest = utils.StringPointer(initSessionRply.Attributes.Digest()) + } + + if args.AllocateResources { + initReply.ResourceAllocation = initSessionRply.ResourceAllocation + } + + if args.InitSession { + initReply.MaxUsage = utils.Float64Pointer(-1.0) + if *initSessionRply.MaxUsage != time.Duration(-1) { + initReply.MaxUsage = utils.Float64Pointer(initSessionRply.MaxUsage.Seconds()) + } + } + + return nil +} + type V1UpdateSessionArgs struct { GetAttributes bool UpdateSession bool diff --git a/utils/consts.go b/utils/consts.go index ddd7c51d4..f19ecb97d 100755 --- a/utils/consts.go +++ b/utils/consts.go @@ -667,20 +667,21 @@ const ( // SessionS APIs const ( - SessionSv1AuthorizeEvent = "SessionSv1.AuthorizeEvent" - SessionSv1AuthorizeEventWithDigest = "SessionSv1.AuthorizeEventWithDigest" - SessionSv1InitiateSession = "SessionSv1.InitiateSession" - SessionSv1UpdateSession = "SessionSv1.UpdateSession" - SessionSv1TerminateSession = "SessionSv1.TerminateSession" - SessionSv1ProcessCDR = "SessionSv1.ProcessCDR" - SessionSv1ProcessEvent = "SessionSv1.ProcessEvent" - SessionSv1DisconnectSession = "SessionSv1.DisconnectSession" - SessionSv1GetActiveSessions = "SessionSv1.GetActiveSessions" - SessionSv1GetPassiveSessions = "SessionSv1.GetPassiveSessions" - SMGenericV1InitiateSession = "SMGenericV1.InitiateSession" - SMGenericV2InitiateSession = "SMGenericV2.InitiateSession" - SMGenericV2UpdateSession = "SMGenericV2.UpdateSession" - SessionSv1Ping = "SessionSv1.Ping" + SessionSv1AuthorizeEvent = "SessionSv1.AuthorizeEvent" + SessionSv1AuthorizeEventWithDigest = "SessionSv1.AuthorizeEventWithDigest" + SessionSv1InitiateSession = "SessionSv1.InitiateSession" + SessionSv1InitiateSessionWithDigest = "SessionSv1.InitiateSessionWithDigest" + SessionSv1UpdateSession = "SessionSv1.UpdateSession" + SessionSv1TerminateSession = "SessionSv1.TerminateSession" + SessionSv1ProcessCDR = "SessionSv1.ProcessCDR" + SessionSv1ProcessEvent = "SessionSv1.ProcessEvent" + SessionSv1DisconnectSession = "SessionSv1.DisconnectSession" + SessionSv1GetActiveSessions = "SessionSv1.GetActiveSessions" + SessionSv1GetPassiveSessions = "SessionSv1.GetPassiveSessions" + SMGenericV1InitiateSession = "SMGenericV1.InitiateSession" + SMGenericV2InitiateSession = "SMGenericV2.InitiateSession" + SMGenericV2UpdateSession = "SMGenericV2.UpdateSession" + SessionSv1Ping = "SessionSv1.Ping" ) // DispatcherS APIs