Commit 5ee216b1 authored by Roshan Patil's avatar Roshan Patil
Browse files

Statemdl + router versioning

parent b193666e
1 merge request!59Statemdl + router versioning
Showing with 799 additions and 158 deletions
......@@ -9,6 +9,8 @@ import (
"sync"
"time"
"corelab.mkcl.org/MKCLOS/coredevelopmentplatform/corepkgv2/statemdl"
"github.com/pquerna/ffjson/ffjson"
"corelab.mkcl.org/MKCLOS/coredevelopmentplatform/corepkgv2/hashmdl"
......@@ -56,8 +58,8 @@ func GetDataDAO(filePath, query string, isCachable bool, cacheTime time.Duration
return rs, nil
}
if isCachable {
data, found := Fastcache.Get(filePath + query)
go statemdl.UpdateGlobalServiceCacheState(found)
if errormdl.CheckBool(found) {
val, ok := data.(gjson.Result)
if errormdl.CheckBool1(ok) {
......
package routebuildermdl
import (
"fmt"
"testing"
"corelab.mkcl.org/MKCLOS/coredevelopmentplatform/corepkgv2/dalmdl/mongodb"
"github.com/stretchr/testify/assert"
)
func TestRunable_Run(t *testing.T) {
err := mongodb.Init("../testingdata/testData/config/config.toml", "host1")
assert.NoError(t, err)
query := `{"name": "~1", "age": ~2}`
input := `{"name": "roshan", "age": 23}`
run := RegisterMasterService("serviceName", true, false).
IsCachable().
MongoService("test", query).
SetArgs("name", "age")
result, err := run.Run([]byte(input))
fmt.Println(result)
assert.NotNil(t, result)
assert.NoError(t, err)
}
func TestFDB_Run(t *testing.T) {
path := "../testingdata/users.json"
run := RegisterMasterService("serviceName", true, false).
IsCachableWithExpiration(1000).
FDBService(path, "*")
result, err := run.Run(nil)
fmt.Println(result)
assert.NotNil(t, result)
assert.NoError(t, err)
}
// func TestRunable_Run(t *testing.T) {
// err := mongodb.Init("../testingdata/testData/config/config.toml", "host1")
// assert.NoError(t, err)
// query := `{"name": "~1", "age": ~2}`
// input := `{"name": "roshan", "age": 23}`
// run := RegisterMasterService("serviceName", true, false).
// IsCachable().
// MongoService("test", query).
// SetArgs("name", "age")
// result, err := run.Run([]byte(input))
// fmt.Println(result)
// assert.NotNil(t, result)
// assert.NoError(t, err)
// }
// func TestFDB_Run(t *testing.T) {
// path := "../testingdata/users.json"
// run := RegisterMasterService("serviceName", true, false).
// IsCachableWithExpiration(1000).
// FDBService(path, "*")
// result, err := run.Run(nil)
// fmt.Println(result)
// assert.NotNil(t, result)
// assert.NoError(t, err)
// }
......@@ -7,6 +7,8 @@ import (
"strings"
"time"
"github.com/hashicorp/go-version"
"corelab.mkcl.org/MKCLOS/coredevelopmentplatform/corepkgv2/statemdl"
"corelab.mkcl.org/MKCLOS/coredevelopmentplatform/corepkgv2/authmdl/roleenforcemdl"
......@@ -26,7 +28,7 @@ import (
func Init(o, r, c *gin.RouterGroup, JWTKey string) {
o.POST("/mql", OpenHandler)
o.POST("/mql/login", loginHandler)
o.POST("/mqlstate", statemdl.StateHandler)
o.POST("/mql/state", statemdl.StateHandler)
r.POST("/mql", RestrictedHandler)
c.POST("/mql", RoleBasedHandler)
jwtmdl.GlobalJWTKey = JWTKey
......@@ -83,14 +85,18 @@ func executeService(name string, data []byte, isForm bool, formData *multipart.F
}
servingTime := time.Since(start)
// Record State for every service
go statemdl.UpdateServiceState(name, servingTime, serviceError)
go statemdl.UpdateServiceState(name, servingTime, serviceError, isRestricted, isRoleBased)
return result, serviceError
}
func commonHandler(c *gin.Context, isRestricted, isRoleBased bool, principalObj servicebuildermdl.Principal) {
service := c.Request.Header.Get("Service-Header")
header := c.Request.Header.Get("Content-Type")
versionError := appVersioning(c)
if versionError != nil {
c.JSON(http.StatusExpectationFailed, versionError.Error())
return
}
responseDataObj := setResponseHeader(service)
if isMultipartRequest(header) {
......@@ -227,3 +233,29 @@ func loginHandler(c *gin.Context) {
c.Header("Authorization", token)
c.JSON(http.StatusOK, data)
}
func appVersioning(c *gin.Context) error {
if isAppVersionEnabled {
appVersion := c.Request.Header.Get("app-version")
if appVersion == "" {
return errormdl.Wrap("No App version Found in request header")
}
ver, err := version.NewVersion(appVersion)
if errormdl.CheckErr(err) != nil {
return errormdl.CheckErr(err)
}
if isStrictMode {
if !ver.Equal(applicationVersion) {
return errormdl.Wrap("Application version mismatched")
}
} else {
if ver.GreaterThan(applicationVersion) {
return errormdl.Wrap("Server Version is outdated")
}
if ver.LessThan(minimumSupportedVersion) {
return errormdl.Wrap("Client Version is outdated")
}
}
}
return nil
}
package routebuildermdl
import (
"bytes"
"fmt"
"mime/multipart"
"strings"
"time"
"corelab.mkcl.org/MKCLOS/coredevelopmentplatform/corepkgv2/errormdl"
"corelab.mkcl.org/MKCLOS/coredevelopmentplatform/corepkgv2/servicebuildermdl"
"github.com/hashicorp/go-version"
"github.com/tidwall/gjson"
"corelab.mkcl.org/MKCLOS/coredevelopmentplatform/corepkgv2/errormdl"
"corelab.mkcl.org/MKCLOS/coredevelopmentplatform/corepkgv2/filemdl"
"corelab.mkcl.org/MKCLOS/coredevelopmentplatform/corepkgv2/cachemdl"
)
const (
// EXPORT :- js export
EXPORT = "export"
// CONSTT :- js const
CONSTT = "const"
open = "O_"
restricted = "R_"
acl = "C_"
)
var (
restrictedServices cachemdl.FastCacheHelper
roleBasedServices cachemdl.FastCacheHelper
openServices cachemdl.FastCacheHelper
loginService func(*gjson.Result, servicebuildermdl.Principal) (interface{}, string, error)
var restrictedServices cachemdl.FastCacheHelper
var roleBasedServices cachemdl.FastCacheHelper
var openServices cachemdl.FastCacheHelper
var loginService func(*gjson.Result, servicebuildermdl.Principal) (interface{}, string, error)
applicationVersion *version.Version
minimumSupportedVersion *version.Version
isAppVersionEnabled bool
isStrictMode bool
)
func init() {
restrictedServices.Setup(10, time.Second*600, time.Second*600)
......@@ -101,25 +93,27 @@ func commonServiceRegistration(serviceName string, service ServiceCache, isRestr
}
}
func createServiceJS(rs *gjson.Result, principalObj servicebuildermdl.Principal) (interface{}, error) {
buf := new(bytes.Buffer)
// SetAppVersion -SetAppVersion
func SetAppVersion(appVersion, minSupportedVersion string) error {
for k := range openServices.FastCache.Items() {
srv := EXPORT + " " + CONSTT + " " + open + strings.ToUpper(k) + " = 'O." + k + "'"
buf.WriteString(fmt.Sprintln(srv))
app, err := version.NewVersion(appVersion)
if errormdl.CheckErr(err) != nil {
return errormdl.CheckErr(err)
}
for k := range restrictedServices.FastCache.Items() {
srv := EXPORT + " " + CONSTT + " " + restricted + strings.ToUpper(k) + " = 'R." + k + "'"
buf.WriteString(fmt.Sprintln(srv))
}
for k := range roleBasedServices.FastCache.Items() {
srv := EXPORT + " " + CONSTT + " " + acl + strings.ToUpper(k) + " = 'C." + k + "'"
buf.WriteString(fmt.Sprintln(srv))
min, err := version.NewVersion(minSupportedVersion)
if errormdl.CheckErr(err) != nil {
return errormdl.CheckErr(err)
}
saveError := filemdl.GetInstance().Save("./services.js", buf.Bytes(), true, false)
if errormdl.CheckErr(saveError) != nil {
return nil, errormdl.CheckErr(saveError)
versionValidation := min.Compare(app)
if versionValidation == 1 {
return errormdl.Wrap("Minimum version is more than app version")
}
if versionValidation == 0 {
isStrictMode = true
}
return "success", nil
applicationVersion = app
minimumSupportedVersion = min
isAppVersionEnabled = true
return nil
}
package routebuildermdl
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestSetAppVersion(t *testing.T) {
err := SetAppVersion("1.0.1", "1.0.0")
assert.NoError(t, err)
}
func Test1SetAppVersion(t *testing.T) {
err := SetAppVersion("1.0.1", "1.0.1")
assert.NoError(t, err)
}
func Test2SetAppVersion(t *testing.T) {
err := SetAppVersion("1.0", "1.0.1")
assert.Error(t, err)
}
func Test3SetAppVersion(t *testing.T) {
err := SetAppVersion("", "1.0.1")
assert.Error(t, err)
}
func Test4SetAppVersion(t *testing.T) {
err := SetAppVersion("1.0.1", "2.0.1")
assert.Error(t, err)
}
func Test5SetAppVersion(t *testing.T) {
err := SetAppVersion("1.0.1", "")
assert.Error(t, err)
}
......@@ -10,14 +10,22 @@ import (
// Statistic - for app application
type Statistic struct {
ServiceName string `json:"serviceName"`
TotalHits int `json:"totalHits"`
MaxTime time.Duration `json:"maxTime"`
MinTime time.Duration `json:"minTime"`
TotalTime time.Duration `json:"totalTime"`
ErrorCount int `json:"errorCount"`
LastError string `json:"lastError"`
Description string `json:"description"`
ServiceName string `json:"serviceName"`
TotalHits int `json:"totalHits"`
MaxTime time.Duration `json:"maxTime"`
MinTime time.Duration `json:"minTime"`
TotalTime time.Duration `json:"totalTime"`
ErrorCount int `json:"errorCount"`
ErrorTime *time.Time `json:"errorTime"`
LastError string `json:"lastError"`
Description string `json:"description"`
IsRestricted bool `json:"isRestricted"`
IsRoleBased bool `json:"isRoleBased"`
}
type groupResponse struct {
GroupTime string `json:"name"`
Hits int64 `json:"hits"`
}
type clientResponse struct {
......@@ -26,6 +34,7 @@ type clientResponse struct {
CacheHits int64 `json:"cacheHits"`
CacheMiss int64 `json:"cacheMiss"`
StartTime time.Time `json:"startTime"`
GroupReport []groupResponse `json:"groupReport"`
}
type cacheStates struct {
totalHits int64
......@@ -38,6 +47,14 @@ var stateCache map[string]Statistic
var stateMutex = &sync.Mutex{}
var cacheStatistic *cacheStates
var groupName []int64
var groupHits []int64
var groupMutex = &sync.Mutex{}
var currentGroup int64
var nextGroup int64
var nextTime = time.Second * 60
// serverStartTime - server start time
var serverStartTime time.Time
......@@ -47,40 +64,68 @@ func init() {
}
serverStartTime = time.Now()
stateCache = make(map[string]Statistic)
current := time.Now()
groupName = append(groupName, current.Unix())
groupHits = append(groupHits, 0)
currentGroup = current.Unix()
nextGroup = current.Add(nextTime).Unix()
}
func updateGlobalHit() {
cacheStatistic.cacheHitsMutex.Lock()
updateGroupCache(cacheStatistic.totalHits)
cacheStatistic.totalHits++
cacheStatistic.cacheHitsMutex.Unlock()
}
func updateGroupCache(hitCount int64) {
groupMutex.Lock()
current := time.Now()
if current.Unix() < nextGroup {
for i := 0; i < len(groupName); i++ {
if groupName[i] == currentGroup {
groupHits[i]++
}
}
} else {
groupName = append(groupName, nextGroup)
groupHits = append(groupHits, 1)
currentGroup = nextGroup
nextGroup = current.Add(nextTime).Unix()
}
groupMutex.Unlock()
}
// UpdateServiceState - update entry of service in state map
func UpdateServiceState(serviceName string, servingTime time.Duration, serviceError error) {
func UpdateServiceState(serviceName string, servingTime time.Duration, serviceError error, isRestricted, isRoleBased bool) {
stateMutex.Lock()
defer stateMutex.Unlock()
serviceState, ok := stateCache[serviceName]
if !ok {
serviceState = Statistic{
ServiceName: serviceName,
ServiceName: serviceName,
IsRestricted: isRestricted,
IsRoleBased: isRoleBased,
}
}
serviceState.TotalHits++
if serviceError != nil {
serviceState.ErrorCount++
serviceState.LastError = serviceError.Error()
ct := time.Now()
serviceState.ErrorTime = &ct
} else {
serviceState.TotalTime += servingTime
if servingTime > serviceState.MaxTime {
serviceState.MaxTime = servingTime
} else if servingTime < serviceState.MinTime {
}
if servingTime < serviceState.MinTime || serviceState.MinTime == 0 {
serviceState.MinTime = servingTime
}
}
stateCache[serviceName] = serviceState
stateMutex.Unlock()
updateGlobalHit()
}
// UpdateGlobalServiceCacheState - update only cache hits and miss count for all services
......@@ -96,6 +141,7 @@ func UpdateGlobalServiceCacheState(cacheHit bool) {
// StateHandler handler function for sta
func StateHandler(c *gin.Context) {
c.Header("Access-Control-Allow-Origin", "*")
clientResponseData := &clientResponse{}
clientResponseData.StartTime = serverStartTime
cacheStatistic.cacheHitsMutex.Lock()
......@@ -103,6 +149,32 @@ func StateHandler(c *gin.Context) {
clientResponseData.CacheHits = cacheStatistic.cacheHits
clientResponseData.CacheMiss = cacheStatistic.cacheMiss
cacheStatistic.cacheHitsMutex.Unlock()
groupMutex.Lock()
current := time.Now()
if current.Unix() > nextGroup {
tmp := time.Unix(currentGroup, 0)
for {
tmp = tmp.Add(nextTime)
if tmp.Unix() >= current.Unix() {
break
}
groupName = append(groupName, tmp.Unix())
groupHits = append(groupHits, 0)
currentGroup = tmp.Unix()
nextGroup = tmp.Add(nextTime).Unix()
}
}
for i, name := range groupName {
gr := groupResponse{}
// gr.GroupTime = int64(time.Unix(name, 0).Second())
gr.GroupTime = time.Unix(name, 0).String()
gr.Hits = groupHits[i]
clientResponseData.GroupReport = append(clientResponseData.GroupReport, gr)
}
if len(clientResponseData.GroupReport) > 10 {
clientResponseData.GroupReport = clientResponseData.GroupReport[len(clientResponseData.GroupReport)-10:]
}
groupMutex.Unlock()
clientResponseData.ServicesState = stateCache
c.JSON(http.StatusOK, clientResponseData)
}
......@@ -5,7 +5,7 @@ version = "1.2.2"
[mongohosts]
[mongohosts.host1]
server = "localhost:27017"
username = "roshan"
password = "roshan"
database = "cdp"
server = "10.2.10.160:27017"
#username = "roshan"
# password = "roshan"
database = "Timeline"
[{
"name": "CDPUser",
"loginId": "cdpuser",
"emailId": "",
"password": "cdpuser123",
"oldPassword": "",
"mobileNo": "",
"isEnabled": true,
"confirmPassword": "",
"path": "",
"pre": {
"group": ["Admin"],
"roles": []
},
"userId": "0xvdsBXmB51OX68TNGSC4TmYzHt"
},
{
"name": "Roshan Patil",
"loginId": "roshanp",
"emailId": "roshanp@mkcl.org",
"password": "roshanp",
"oldPassword": "",
"mobileNo": "84211553539",
"isEnabled": true,
"confirmPassword": "",
"path": "4463acaefbcf3e6511883f9d4f0b6076.jpg",
"pre": {
"group": ["Publisher"],
"roles": []
},
"userId": "4463acaefbcf3e6511883f9d4f0b6076"
},
{
"name": "roshanp",
"loginId": "roshanp1",
"emailId": "roshanp1@mkcl.org",
"password": "roshanp1",
"oldPassword": "",
"mobileNo": "8421553539",
"isEnabled": false,
"confirmPassword": "",
"path": "4a6a605fb3fee94244c06f53613bedd4.jpg",
"pre": {
"group": ["Publisher"],
"roles": []
},
"userId": "4a6a605fb3fee94244c06f53613bedd4"
},
{
"name": "SystemIntegrator",
"loginId": "SystemIntegrator",
"emailId": "SystemIntegrator@mkcl.org",
"password": "SystemIntegrator",
"oldPassword": "",
"mobileNo": "7875383220",
"isEnabled": true,
"confirmPassword": "",
"path": "309037970a38dc127deba6ff4352ad70.jpg",
"pre": {
"group": ["Admin"],
"roles": []
},
"userId": "309037970a38dc127deba6ff4352ad70"
}]
\ No newline at end of file
[
{
"name": "CDPUser",
"loginId": "cdpuser",
"emailId": "",
"password": "cdpuser123",
"oldPassword": "",
"mobileNo": "",
"isEnabled": true,
"confirmPassword": "",
"path": "",
"pre": {
"group": [
"Admin"
],
"roles": []
},
"userId": "0xvdsBXmB51OX68TNGSC4TmYzHt"
},
{
"name": "Roshan Patil",
"loginId": "roshanp",
"emailId": "roshanp@mkcl.org",
"password": "roshanp",
"oldPassword": "",
"mobileNo": "84211553539",
"isEnabled": true,
"confirmPassword": "",
"path": "4463acaefbcf3e6511883f9d4f0b6076.jpg",
"pre": {
"group": [
"Publisher"
],
"roles": []
},
"userId": "4463acaefbcf3e6511883f9d4f0b6076"
},
{
"name": "roshanp",
"loginId": "roshanp1",
"emailId": "roshanp1@mkcl.org",
"password": "roshanp1",
"oldPassword": "",
"mobileNo": "8421553539",
"isEnabled": false,
"confirmPassword": "",
"path": "4a6a605fb3fee94244c06f53613bedd4.jpg",
"pre": {
"group": [
"Publisher"
],
"roles": []
},
"userId": "4a6a605fb3fee94244c06f53613bedd4"
},
{
"name": "SystemIntegrator",
"loginId": "SystemIntegrator",
"emailId": "SystemIntegrator@mkcl.org",
"password": "SystemIntegrator",
"oldPassword": "",
"mobileNo": "7875383220",
"isEnabled": true,
"confirmPassword": "",
"path": "309037970a38dc127deba6ff4352ad70.jpg",
"pre": {
"group": [
"Admin"
],
"roles": []
},
"userId": "309037970a38dc127deba6ff4352ad70"
},
{
"name": "CDPUser",
"loginId": "cdpuser",
"emailId": "",
"password": "cdpuser123",
"oldPassword": "",
"mobileNo": "",
"isEnabled": true,
"confirmPassword": "",
"path": "",
"pre": {
"group": [
"Admin"
],
"roles": []
},
"userId": "0xvdsBXmB51OX68TNGSC4TmYzHt"
},
{
"name": "Roshan Patil",
"loginId": "roshanp",
"emailId": "roshanp@mkcl.org",
"password": "roshanp",
"oldPassword": "",
"mobileNo": "84211553539",
"isEnabled": true,
"confirmPassword": "",
"path": "4463acaefbcf3e6511883f9d4f0b6076.jpg",
"pre": {
"group": [
"Publisher"
],
"roles": []
},
"userId": "4463acaefbcf3e6511883f9d4f0b6076"
},
{
"name": "roshanp",
"loginId": "roshanp1",
"emailId": "roshanp1@mkcl.org",
"password": "roshanp1",
"oldPassword": "",
"mobileNo": "8421553539",
"isEnabled": false,
"confirmPassword": "",
"path": "4a6a605fb3fee94244c06f53613bedd4.jpg",
"pre": {
"group": [
"Publisher"
],
"roles": []
},
"userId": "4a6a605fb3fee94244c06f53613bedd4"
},
{
"name": "SystemIntegrator",
"loginId": "SystemIntegrator",
"emailId": "SystemIntegrator@mkcl.org",
"password": "SystemIntegrator",
"oldPassword": "",
"mobileNo": "7875383220",
"isEnabled": true,
"confirmPassword": "",
"path": "309037970a38dc127deba6ff4352ad70.jpg",
"pre": {
"group": [
"Admin"
],
"roles": []
},
"userId": "309037970a38dc127deba6ff4352ad70"
},
{
"name": "CDPUser",
"loginId": "cdpuser",
"emailId": "",
"password": "cdpuser123",
"oldPassword": "",
"mobileNo": "",
"isEnabled": true,
"confirmPassword": "",
"path": "",
"pre": {
"group": [
"Admin"
],
"roles": []
},
"userId": "0xvdsBXmB51OX68TNGSC4TmYzHt"
},
{
"name": "Roshan Patil",
"loginId": "roshanp",
"emailId": "roshanp@mkcl.org",
"password": "roshanp",
"oldPassword": "",
"mobileNo": "84211553539",
"isEnabled": true,
"confirmPassword": "",
"path": "4463acaefbcf3e6511883f9d4f0b6076.jpg",
"pre": {
"group": [
"Publisher"
],
"roles": []
},
"userId": "4463acaefbcf3e6511883f9d4f0b6076"
},
{
"name": "roshanp",
"loginId": "roshanp1",
"emailId": "roshanp1@mkcl.org",
"password": "roshanp1",
"oldPassword": "",
"mobileNo": "8421553539",
"isEnabled": false,
"confirmPassword": "",
"path": "4a6a605fb3fee94244c06f53613bedd4.jpg",
"pre": {
"group": [
"Publisher"
],
"roles": []
},
"userId": "4a6a605fb3fee94244c06f53613bedd4"
},
{
"name": "SystemIntegrator",
"loginId": "SystemIntegrator",
"emailId": "SystemIntegrator@mkcl.org",
"password": "SystemIntegrator",
"oldPassword": "",
"mobileNo": "7875383220",
"isEnabled": true,
"confirmPassword": "",
"path": "309037970a38dc127deba6ff4352ad70.jpg",
"pre": {
"group": [
"Admin"
],
"roles": []
},
"userId": "309037970a38dc127deba6ff4352ad70"
},
{
"name": "CDPUser",
"loginId": "cdpuser",
"emailId": "",
"password": "cdpuser123",
"oldPassword": "",
"mobileNo": "",
"isEnabled": true,
"confirmPassword": "",
"path": "",
"pre": {
"group": [
"Admin"
],
"roles": []
},
"userId": "0xvdsBXmB51OX68TNGSC4TmYzHt"
},
{
"name": "Roshan Patil",
"loginId": "roshanp",
"emailId": "roshanp@mkcl.org",
"password": "roshanp",
"oldPassword": "",
"mobileNo": "84211553539",
"isEnabled": true,
"confirmPassword": "",
"path": "4463acaefbcf3e6511883f9d4f0b6076.jpg",
"pre": {
"group": [
"Publisher"
],
"roles": []
},
"userId": "4463acaefbcf3e6511883f9d4f0b6076"
},
{
"name": "roshanp",
"loginId": "roshanp1",
"emailId": "roshanp1@mkcl.org",
"password": "roshanp1",
"oldPassword": "",
"mobileNo": "8421553539",
"isEnabled": false,
"confirmPassword": "",
"path": "4a6a605fb3fee94244c06f53613bedd4.jpg",
"pre": {
"group": [
"Publisher"
],
"roles": []
},
"userId": "4a6a605fb3fee94244c06f53613bedd4"
},
{
"name": "SystemIntegrator",
"loginId": "SystemIntegrator",
"emailId": "SystemIntegrator@mkcl.org",
"password": "SystemIntegrator",
"oldPassword": "",
"mobileNo": "7875383220",
"isEnabled": true,
"confirmPassword": "",
"path": "309037970a38dc127deba6ff4352ad70.jpg",
"pre": {
"group": [
"Admin"
],
"roles": []
},
"userId": "309037970a38dc127deba6ff4352ad70"
},
{
"name": "CDPUser",
"loginId": "cdpuser",
"emailId": "",
"password": "cdpuser123",
"oldPassword": "",
"mobileNo": "",
"isEnabled": true,
"confirmPassword": "",
"path": "",
"pre": {
"group": [
"Admin"
],
"roles": []
},
"userId": "0xvdsBXmB51OX68TNGSC4TmYzHt"
},
{
"name": "Roshan Patil",
"loginId": "roshanp",
"emailId": "roshanp@mkcl.org",
"password": "roshanp",
"oldPassword": "",
"mobileNo": "84211553539",
"isEnabled": true,
"confirmPassword": "",
"path": "4463acaefbcf3e6511883f9d4f0b6076.jpg",
"pre": {
"group": [
"Publisher"
],
"roles": []
},
"userId": "4463acaefbcf3e6511883f9d4f0b6076"
},
{
"name": "roshanp",
"loginId": "roshanp1",
"emailId": "roshanp1@mkcl.org",
"password": "roshanp1",
"oldPassword": "",
"mobileNo": "8421553539",
"isEnabled": false,
"confirmPassword": "",
"path": "4a6a605fb3fee94244c06f53613bedd4.jpg",
"pre": {
"group": [
"Publisher"
],
"roles": []
},
"userId": "4a6a605fb3fee94244c06f53613bedd4"
},
{
"name": "SystemIntegrator",
"loginId": "SystemIntegrator",
"emailId": "SystemIntegrator@mkcl.org",
"password": "SystemIntegrator",
"oldPassword": "",
"mobileNo": "7875383220",
"isEnabled": true,
"confirmPassword": "",
"path": "309037970a38dc127deba6ff4352ad70.jpg",
"pre": {
"group": [
"Admin"
],
"roles": []
},
"userId": "309037970a38dc127deba6ff4352ad70"
},
{
"name": "CDPUser",
"loginId": "cdpuser",
"emailId": "",
"password": "cdpuser123",
"oldPassword": "",
"mobileNo": "",
"isEnabled": true,
"confirmPassword": "",
"path": "",
"pre": {
"group": [
"Admin"
],
"roles": []
},
"userId": "0xvdsBXmB51OX68TNGSC4TmYzHt"
},
{
"name": "Roshan Patil",
"loginId": "roshanp",
"emailId": "roshanp@mkcl.org",
"password": "roshanp",
"oldPassword": "",
"mobileNo": "84211553539",
"isEnabled": true,
"confirmPassword": "",
"path": "4463acaefbcf3e6511883f9d4f0b6076.jpg",
"pre": {
"group": [
"Publisher"
],
"roles": []
},
"userId": "4463acaefbcf3e6511883f9d4f0b6076"
},
{
"name": "roshanp",
"loginId": "roshanp1",
"emailId": "roshanp1@mkcl.org",
"password": "roshanp1",
"oldPassword": "",
"mobileNo": "8421553539",
"isEnabled": false,
"confirmPassword": "",
"path": "4a6a605fb3fee94244c06f53613bedd4.jpg",
"pre": {
"group": [
"Publisher"
],
"roles": []
},
"userId": "4a6a605fb3fee94244c06f53613bedd4"
},
{
"name": "SystemIntegrator",
"loginId": "SystemIntegrator",
"emailId": "SystemIntegrator@mkcl.org",
"password": "SystemIntegrator",
"oldPassword": "",
"mobileNo": "7875383220",
"isEnabled": true,
"confirmPassword": "",
"path": "309037970a38dc127deba6ff4352ad70.jpg",
"pre": {
"group": [
"Admin"
],
"roles": []
},
"userId": "309037970a38dc127deba6ff4352ad70"
},
{
"name": "CDPUser",
"loginId": "cdpuser",
"emailId": "",
"password": "cdpuser123",
"oldPassword": "",
"mobileNo": "",
"isEnabled": true,
"confirmPassword": "",
"path": "",
"pre": {
"group": [
"Admin"
],
"roles": []
},
"userId": "0xvdsBXmB51OX68TNGSC4TmYzHt"
},
{
"name": "Roshan Patil",
"loginId": "roshanp",
"emailId": "roshanp@mkcl.org",
"password": "roshanp",
"oldPassword": "",
"mobileNo": "84211553539",
"isEnabled": true,
"confirmPassword": "",
"path": "4463acaefbcf3e6511883f9d4f0b6076.jpg",
"pre": {
"group": [
"Publisher"
],
"roles": []
},
"userId": "4463acaefbcf3e6511883f9d4f0b6076"
},
{
"name": "roshanp",
"loginId": "roshanp1",
"emailId": "roshanp1@mkcl.org",
"password": "roshanp1",
"oldPassword": "",
"mobileNo": "8421553539",
"isEnabled": false,
"confirmPassword": "",
"path": "4a6a605fb3fee94244c06f53613bedd4.jpg",
"pre": {
"group": [
"Publisher"
],
"roles": []
},
"userId": "4a6a605fb3fee94244c06f53613bedd4"
},
{
"name": "SystemIntegrator",
"loginId": "SystemIntegrator",
"emailId": "SystemIntegrator@mkcl.org",
"password": "SystemIntegrator",
"oldPassword": "",
"mobileNo": "7875383220",
"isEnabled": true,
"confirmPassword": "",
"path": "309037970a38dc127deba6ff4352ad70.jpg",
"pre": {
"group": [
"Admin"
],
"roles": []
},
"userId": "309037970a38dc127deba6ff4352ad70"
},
{
"name": "CDPUser",
"loginId": "cdpuser",
"emailId": "",
"password": "cdpuser123",
"oldPassword": "",
"mobileNo": "",
"isEnabled": true,
"confirmPassword": "",
"path": "",
"pre": {
"group": [
"Admin"
],
"roles": []
},
"userId": "0xvdsBXmB51OX68TNGSC4TmYzHt"
},
{
"name": "Roshan Patil",
"loginId": "roshanp",
"emailId": "roshanp@mkcl.org",
"password": "roshanp",
"oldPassword": "",
"mobileNo": "84211553539",
"isEnabled": true,
"confirmPassword": "",
"path": "4463acaefbcf3e6511883f9d4f0b6076.jpg",
"pre": {
"group": [
"Publisher"
],
"roles": []
},
"userId": "4463acaefbcf3e6511883f9d4f0b6076"
},
{
"name": "roshanp",
"loginId": "roshanp1",
"emailId": "roshanp1@mkcl.org",
"password": "roshanp1",
"oldPassword": "",
"mobileNo": "8421553539",
"isEnabled": false,
"confirmPassword": "",
"path": "4a6a605fb3fee94244c06f53613bedd4.jpg",
"pre": {
"group": [
"Publisher"
],
"roles": []
},
"userId": "4a6a605fb3fee94244c06f53613bedd4"
},
{
"name": "SystemIntegrator",
"loginId": "SystemIntegrator",
"emailId": "SystemIntegrator@mkcl.org",
"password": "SystemIntegrator",
"oldPassword": "",
"mobileNo": "7875383220",
"isEnabled": true,
"confirmPassword": "",
"path": "309037970a38dc127deba6ff4352ad70.jpg",
"pre": {
"group": [
"Admin"
],
"roles": []
},
"userId": "309037970a38dc127deba6ff4352ad70"
}
]
\ No newline at end of file
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment