Merge branch 'poc2'
diff --git a/api.go b/api.go index 241e472..3361c74 100644 --- a/api.go +++ b/api.go
@@ -98,12 +98,7 @@ return errorResponse(reason, errorCode) } - /* - * NOTE: that here c.expired_at has been commented out because it is not - * kept track of by Cassandra (hence always defaults to -1). FIXME - */ - - sSql = "SELECT ap.res_names, ap.env, c.issued_at, c.status, a.cback_url, d.username, d.id FROM APP_CREDENTIAL AS c INNER JOIN APP AS a ON c.app_id = a.id INNER JOIN DEVELOPER AS d ON a.dev_id = d.id INNER JOIN APP_AND_API_PRODUCT_MAPPER as mp ON mp.app_cred_id = c.id INNER JOIN API_PRODUCT as ap ON ap.id = mp.api_prdt_id WHERE (UPPER(d.sts) = 'ACTIVE' AND mp.api_prdt_id = ap.id AND mp.app_id = a.id AND mp.app_cred_id = c.id AND UPPER(mp.api_prdt_status) = 'APPROVED' AND UPPER(a.status) = 'APPROVED' AND UPPER(c.status) = 'APPROVED' AND c.id = '" + key + "' AND c.org = '" + org + "');" + sSql = "SELECT ap.api_resources, ap.environments, c.issued_at, c.status, a.callback_url, d.username, d.id FROM APP_CREDENTIAL AS c INNER JOIN APP AS a ON c.app_id = a.id INNER JOIN DEVELOPER AS d ON a.developer_id = d.id INNER JOIN APP_CREDENTIAL_APIPRODUCT_MAPPER as mp ON mp.appcred_id = c.id INNER JOIN API_PRODUCT as ap ON ap.id = mp.apiprdt_id WHERE (UPPER(d.status) = 'ACTIVE' AND mp.apiprdt_id = ap.id AND mp.app_id = a.id AND mp.appcred_id = c.id AND UPPER(mp.status) = 'APPROVED' AND UPPER(a.status) = 'APPROVED' AND c.id = '" + key + "' AND c._apid_scope = '" + org + "');" err = db.QueryRow(sSql).Scan(&resName, &resEnv, &issuedAt, &status, &redirectionURIs, &developerAppName, &developerId)
diff --git a/api_test.go b/api_test.go index 2d9d921..50d1567 100644 --- a/api_test.go +++ b/api_test.go
@@ -5,7 +5,7 @@ "encoding/json" "github.com/30x/apid" "github.com/30x/apid/factory" - . "github.com/30x/apidApigeeSync" // for direct access to Payload types + "github.com/apigee-labs/transicator/common" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" "io/ioutil" @@ -39,8 +39,10 @@ db, err = apid.Data().DB() Expect(err).NotTo(HaveOccurred()) - insertTestData(db) - + txn, err := db.Begin() + Expect(err).ShouldNot(HaveOccurred()) + insertTestData(db, txn) + txn.Commit() server = httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { if req.URL.Path == apiPath { handleRequest(w, req) @@ -66,33 +68,33 @@ Expect(respj.ErrInfo.ErrorCode).Should(Equal("REQ_ENTRY_NOT_FOUND")) }) + /* + It("should reject a key once it's deleted", func() { + pd0 := &DataPayload{ + EntityIdentifier: "app_credential_0", + } + res := deleteCredential(*pd0, db) + Expect(res).Should(BeTrue()) - It("should reject a key once it's deleted", func() { - pd0 := &DataPayload{ - EntityIdentifier: "credential_0", - } - res := deleteCredential(*pd0, db, "Org_0") - Expect(res).Should(BeTrue()) + var respj kmsResponseFail + rsp, err := verifyAPIKey("app_credential_0", "/test", "Env_0", "Org_0", "verify") + Expect(err).ShouldNot(HaveOccurred()) - var respj kmsResponseFail - rsp, err := verifyAPIKey("credential_0", "/test", "Env_0", "Org_0", "verify") - Expect(err).ShouldNot(HaveOccurred()) - - json.Unmarshal(rsp, &respj) - Expect(respj.Type).Should(Equal("ErrorResult")) - Expect(respj.ErrInfo.ErrorCode).Should(Equal("REQ_ENTRY_NOT_FOUND")) - }) - + json.Unmarshal(rsp, &respj) + Expect(respj.Type).Should(Equal("ErrorResult")) + Expect(respj.ErrInfo.ErrorCode).Should(Equal("REQ_ENTRY_NOT_FOUND")) + }) + */ It("should successfully verify good keys", func() { for i := 1; i < 10; i++ { resulti := strconv.FormatInt(int64(i), 10) - rsp, err := verifyAPIKey("credential_"+resulti, "/test", "Env_0", "Org_0", "verify") + rsp, err := verifyAPIKey("app_credential_"+resulti, "/test", "Env_0", "Org_0", "verify") Expect(err).ShouldNot(HaveOccurred()) var respj kmsResponseSuccess json.Unmarshal(rsp, &respj) Expect(respj.Type).Should(Equal("APIKeyContext")) - Expect(respj.RspInfo.Key).Should(Equal("credential_" + resulti)) + Expect(respj.RspInfo.Key).Should(Equal("app_credential_" + resulti)) } }) }) @@ -134,7 +136,7 @@ v := url.Values{} v.Add("organization", "Org_0") - v.Add("key", "credential_1") + v.Add("key", "app_credential_1") v.Add("environment", "Env_0") v.Add("uriPath", "/test") v.Add("action", "verify") @@ -152,42 +154,101 @@ Expect(err).ShouldNot(HaveOccurred()) json.Unmarshal(body, &respj) Expect(respj.Type).Should(Equal("APIKeyContext")) - Expect(respj.RspInfo.Key).Should(Equal("credential_1")) + Expect(respj.RspInfo.Key).Should(Equal("app_credential_1")) }) }) }) -func insertTestData(db *sql.DB) { +func insertTestData(db *sql.DB, txn *sql.Tx) { for i := 0; i < 10; i++ { + var rows []common.Row + srvItems := common.Row{} result := strconv.FormatInt(int64(i), 10) - pd0 := &DataPayload{ - PldCont: Payload{ - AppName: "Api_product_" + result, - Resources: []string{"/**", "/test"}, - Environments: []string{"Env_0", "Env_1"}, - }, - } - res := insertAPIproduct(*pd0, db, "Org_0") + scv := &common.ColumnVal{ + Value: "api_product_" + result, + Type: 1, + } + srvItems["id"] = scv + + scv = &common.ColumnVal{ + Value: "{/**, /test}", + Type: 1, + } + srvItems["api_resources"] = scv + + scv = &common.ColumnVal{ + Value: "{Env_0, Env_1}", + Type: 1, + } + srvItems["environments"] = scv + + scv = &common.ColumnVal{ + Value: "Org_0", + Type: 1, + } + srvItems["_apid_scope"] = scv + + scv = &common.ColumnVal{ + Value: "tenant_id_xxxx", + Type: 1, + } + srvItems["tenant_id"] = scv + rows = append(rows, srvItems) + res := insertAPIproducts(rows, db, txn) Expect(res).Should(BeTrue()) } for i := 0; i < 10; i++ { + var rows []common.Row + srvItems := common.Row{} result := strconv.FormatInt(int64(i), 10) - pd1 := &DataPayload{ - EntityIdentifier: "developer_id_" + result, - PldCont: Payload{ - Email: "person_0@apigee.com", - Status: "Active", - UserName: "user_0", - FirstName: "user_first_name0", - LastName: "user_last_name0", - }, + scv := &common.ColumnVal{ + Value: "developer_id_" + result, + Type: 1, } + srvItems["id"] = scv - res := insertCreateDeveloper(*pd1, db, "Org_0") + scv = &common.ColumnVal{ + Value: "test@apigee.com", + Type: 1, + } + srvItems["email"] = scv + + scv = &common.ColumnVal{ + Value: "Active", + Type: 1, + } + srvItems["status"] = scv + + scv = &common.ColumnVal{ + Value: "Apigee", + Type: 1, + } + srvItems["firstName"] = scv + + scv = &common.ColumnVal{ + Value: "Google", + Type: 1, + } + srvItems["lastName"] = scv + + scv = &common.ColumnVal{ + Value: "Org_0", + Type: 1, + } + srvItems["_apid_scope"] = scv + + scv = &common.ColumnVal{ + Value: "tenant_id_xxxx", + Type: 1, + } + srvItems["tenant_id"] = scv + + rows = append(rows, srvItems) + res := insertDevelopers(rows, db, txn) Expect(res).Should(BeTrue()) } @@ -195,44 +256,133 @@ for i := 0; i < 10; i++ { resulti := strconv.FormatInt(int64(i), 10) for j = k; j < 10+k; j++ { - resultj := strconv.FormatInt(int64(j), 10) - pd2 := &DataPayload{ - EntityIdentifier: "application_id_" + resultj, - PldCont: Payload{ - Email: "person_0@apigee.com", - Status: "Approved", - AppName: "application_id_" + resultj, - DeveloperId: "developer_id_" + resulti, - CallbackUrl: "call_back_url_0", - }, - } + var rows []common.Row - res := insertCreateApplication(*pd2, db, "Org_0") + srvItems := common.Row{} + resultj := strconv.FormatInt(int64(j), 10) + + scv := &common.ColumnVal{ + Value: "application_id_" + resultj, + Type: 1, + } + srvItems["id"] = scv + + scv = &common.ColumnVal{ + Value: "developer_id_" + resulti, + Type: 1, + } + srvItems["developer_id"] = scv + + scv = &common.ColumnVal{ + Value: "approved", + Type: 1, + } + srvItems["status"] = scv + + scv = &common.ColumnVal{ + Value: "http://apigee.com", + Type: 1, + } + srvItems["callback_url"] = scv + + scv = &common.ColumnVal{ + Value: "Org_0", + Type: 1, + } + srvItems["_apid_scope"] = scv + + scv = &common.ColumnVal{ + Value: "tenant_id_xxxx", + Type: 1, + } + srvItems["tenant_id"] = scv + rows = append(rows, srvItems) + res := insertApplications(rows, db, txn) Expect(res).Should(BeTrue()) } k = j } - j = 0 - k = 0 for i := 0; i < 10; i++ { - resulti := strconv.FormatInt(int64(i), 10) - for j = k; j < 10+k; j++ { - resultj := strconv.FormatInt(int64(j), 10) - pd3 := &DataPayload{ - EntityIdentifier: "credential_" + resultj, - PldCont: Payload{ - AppId: "application_id_" + resulti, - Status: "Approved", - ConsumerSecret: "consumer_secret_0", - IssuedAt: 349583485, - ApiProducts: []Apip{{ApiProduct: "Api_product_0", Status: "Approved"}}, - }, - } + var rows []common.Row + srvItems := common.Row{} + result := strconv.FormatInt(int64(i), 10) - res := insertCreateCredential(*pd3, db, "Org_0") - Expect(res).Should(BeTrue()) + scv := &common.ColumnVal{ + Value: "app_credential_" + result, + Type: 1, } - k = j + srvItems["id"] = scv + + scv = &common.ColumnVal{ + Value: "application_id_" + result, + Type: 1, + } + srvItems["app_id"] = scv + + scv = &common.ColumnVal{ + Value: "approved", + Type: 1, + } + srvItems["status"] = scv + + scv = &common.ColumnVal{ + Value: "Org_0", + Type: 1, + } + srvItems["_apid_scope"] = scv + + scv = &common.ColumnVal{ + Value: "tenant_id_xxxx", + Type: 1, + } + srvItems["tenant_id"] = scv + rows = append(rows, srvItems) + res := insertCredentials(rows, db, txn) + Expect(res).Should(BeTrue()) } + + for i := 0; i < 10; i++ { + var rows []common.Row + srvItems := common.Row{} + result := strconv.FormatInt(int64(i), 10) + + scv := &common.ColumnVal{ + Value: "api_product_" + result, + Type: 1, + } + srvItems["apiprdt_id"] = scv + + scv = &common.ColumnVal{ + Value: "application_id_" + result, + Type: 1, + } + srvItems["app_id"] = scv + + scv = &common.ColumnVal{ + Value: "app_credential_" + result, + Type: 1, + } + srvItems["appcred_id"] = scv + scv = &common.ColumnVal{ + Value: "approved", + Type: 1, + } + srvItems["status"] = scv + scv = &common.ColumnVal{ + Value: "Org_0", + Type: 1, + } + srvItems["_apid_scope"] = scv + + scv = &common.ColumnVal{ + Value: "tenant_id_xxxx", + Type: 1, + } + srvItems["tenant_id"] = scv + rows = append(rows, srvItems) + res := insertAPIProductMappers(rows, db, txn) + Expect(res).Should(BeTrue()) + } + }
diff --git a/init.go b/init.go index 5c243ce..bae3a3f 100644 --- a/init.go +++ b/init.go
@@ -7,7 +7,7 @@ ) const ( - apiPath = "/verifyAPIKey" + apiPath = "/verifiers/apikey" ) var ( @@ -33,7 +33,7 @@ } var count int - row := db.QueryRow("SELECT count(*) FROM sqlite_master WHERE type='table' AND name='company';") + row := db.QueryRow("SELECT count(*) FROM sqlite_master WHERE type='table' AND name='API_PRODUCT' COLLATE NOCASE;") if err := row.Scan(&count); err != nil { log.Panic("Unable to setup database", err) } @@ -50,7 +50,111 @@ } func createTables(db *sql.DB) { - _, err := db.Exec("CREATE TABLE COMPANY (org varchar(255), id varchar(255), PRIMARY KEY (id, org));CREATE TABLE DEVELOPER (org varchar(255), email varchar(255), id varchar(255), sts varchar(255), username varchar(255), firstname varchar(255), lastname varchar(255), apigee_scope varchar(255), enc_password varchar(255), salt varchar(255), created_at integer, created_by varchar(255), updated_at integer, updated_by varchar(255), PRIMARY KEY (id, org));CREATE TABLE APP (org varchar(255), id varchar(255), dev_id varchar(255) null, cmp_id varchar(255) null, display_name varchar(255), apigee_scope varchar(255), type varchar(255), access_type varchar(255), cback_url varchar(255), status varchar(255), name varchar(255), app_family varchar(255), created_at integer, created_by varchar(255), updated_at integer, updated_by varchar(255), PRIMARY KEY (id, org), FOREIGN KEY (dev_id, org) references DEVELOPER (id, org) ON DELETE CASCADE);CREATE TABLE APP_CREDENTIAL (org varchar(255), id varchar(255), app_id varchar(255), cons_secret varchar(255), method_type varchar(255), status varchar(255), issued_at integer, expire_at integer, created_at integer, created_by varchar(255), updated_at integer, updated_by varchar(255), PRIMARY KEY (id, org), FOREIGN KEY (app_id, org) references app (id, org) ON DELETE CASCADE);CREATE TABLE API_PRODUCT (org varchar(255), id varchar(255), res_names varchar(255), env varchar(255), PRIMARY KEY (id, org));CREATE TABLE COMPANY_DEVELOPER (org varchar(255), dev_id varchar(255), id varchar(255), cmpny_id varchar(255), PRIMARY KEY (id, org), FOREIGN KEY (cmpny_id) references company(id) ON DELETE CASCADE, FOREIGN KEY (dev_id, org) references DEVELOPER(id, org) ON DELETE CASCADE);CREATE TABLE APP_AND_API_PRODUCT_MAPPER (org varchar(255), api_prdt_id varchar(255), app_id varchar(255), app_cred_id varchar(255), api_prdt_status varchar(255), PRIMARY KEY (org, api_prdt_id, app_id, app_cred_id), FOREIGN KEY (api_prdt_id, org) references api_product(id, org) ON DELETE CASCADE, FOREIGN KEY (app_cred_id, org) references app_credential(id, org) ON DELETE CASCADE, FOREIGN KEY (app_id, org) references app(id, org) ON DELETE CASCADE);") + _, err := db.Exec(` +CREATE TABLE api_product ( + id text, + tenant_id text, + name text, + display_name text, + description text, + api_resources text[], + approval_type text, + _apid_scope text, + proxies text[], + environments text[], + quota text, + quota_time_unit text, + quota_interval int, + created_at int64, + created_by text, + updated_at int64, + updated_by text, + PRIMARY KEY (tenant_id, id)); +CREATE TABLE developer ( + id text, + tenant_id text, + username text, + first_name text, + last_name text, + password text, + email text, + status text, + encrypted_password text, + salt text, + _apid_scope text, + created_at int64, + created_by text, + updated_at int64, + updated_by text, + PRIMARY KEY (tenant_id, id) +); +CREATE TABLE company ( + id text, + tenant_id text, + name text, + display_name text, + status text, + created_at int64, + created_by text, + updated_at int64, + updated_by text, + _apid_scope text, + PRIMARY KEY (tenant_id, id) +); +CREATE TABLE company_developer ( + tenant_id text, + company_id text, + developer_id text, + roles text[], + created_at int64, + created_by text, + updated_at int64, + updated_by text, + _apid_scope text, + PRIMARY KEY (tenant_id, company_id,developer_id) +); +CREATE TABLE app ( + id text, + tenant_id text, + name text, + display_name text, + access_type text, + callback_url text, + status text, + app_family text, + company_id text, + developer_id text, + type int, + created_at int64, + created_by text, + updated_at int64, + updated_by text, + _apid_scope text, + PRIMARY KEY (tenant_id, id) +); +CREATE TABLE app_credential ( + id text, + tenant_id text, + consumer_secret text, + app_id text, + method_type text, + status text, + issued_at int64, + expires_at int64, + app_status text, + _apid_scope text, + PRIMARY KEY (tenant_id, id) +); +CREATE TABLE app_credential_apiproduct_mapper ( + tenant_id text, + appcred_id text, + app_id text, + apiprdt_id text, + _apid_scope text, + status text, + PRIMARY KEY (appcred_id, app_id, apiprdt_id,tenant_id) +); +`) if err != nil { log.Panic("Unable to initialize DB", err) }
diff --git a/listener.go b/listener.go index 6aec26f..9908f8d 100644 --- a/listener.go +++ b/listener.go
@@ -2,9 +2,8 @@ import ( "database/sql" - "encoding/json" "github.com/30x/apid" - "github.com/30x/apidApigeeSync" + "github.com/apigee-labs/transicator/common" ) type handler struct { @@ -14,241 +13,475 @@ return "verifyAPIKey" } -// todo: The following was basically just copied from old APID - needs review. - func (h *handler) Handle(e apid.Event) { - changeSet, ok := e.(*apidApigeeSync.ChangeSet) - if !ok { - log.Errorf("Received non-ChangeSet event. This shouldn't happen!") + + res := true + db, err := data.DB() + if err != nil { + panic("Unable to access Sqlite DB") + } + + txn, err := db.Begin() + if err != nil { + log.Error("Unable to create Sqlite transaction") return } - log.Debugf("apigeeSyncEvent: %d changes", len(changeSet.Changes)) - - db, err := data.DB() - if err != nil { - panic("help me!") // todo: handle - } - - for _, payload := range changeSet.Changes { - - org := payload.Data.PldCont.Organization - - switch payload.Data.EntityType { - case "developer": - switch payload.Data.Operation { - case "create": - insertCreateDeveloper(payload.Data, db, org) - } - - case "app": - switch payload.Data.Operation { - case "create": - insertCreateApplication(payload.Data, db, org) - } - - case "credential": - switch payload.Data.Operation { - case "create": - insertCreateCredential(payload.Data, db, org) - - case "delete": - deleteCredential(payload.Data, db, org) - } - - case "apiproduct": - switch payload.Data.Operation { - case "create": - insertAPIproduct(payload.Data, db, org) - } + snapData, ok := e.(*common.Snapshot) + if ok { + res = processSnapshot(snapData, txn) + } else { + changeSet, ok := e.(*common.ChangeList) + if ok { + res = processChange(changeSet, txn) + } else { + log.Errorf("Received Invalid event. This shouldn't happen!") } - } + if res == true { + txn.Commit() + } else { + txn.Rollback() + } + return +} + +func processSnapshot(snapshot *common.Snapshot, txn *sql.Tx) bool { + + res := true + log.Debugf("Process Snapshot data") + /* + * Iterate the tables, and insert the rows, + * Commit them in bulk. + */ + for _, payload := range snapshot.Tables { + switch payload.Name { + case "kms.developer": + res = insertDevelopers(payload.Rows, txn) + case "kms.app": + res = insertApplications(payload.Rows, txn) + case "kms.app_credential": + res = insertCredentials(payload.Rows, txn) + case "kms.api_product": + res = insertAPIproducts(payload.Rows, txn) + case "kms.app_credential_apiproduct_mapper": + res = insertAPIProductMappers(payload.Rows, txn) + } + if res == false { + log.Error("Error encountered in Downloading Snapshot for VerifyApiKey") + return false + } + } + log.Debug("Downloading Snapshot for VerifyApiKey complete") + return true } /* - * INSERT INTO APP_CREDENTIAL op + * Performs bulk insert of credentials */ -func insertCreateCredential(ele apidApigeeSync.DataPayload, db *sql.DB, org string) bool { +func insertCredentials(rows []common.Row, txn *sql.Tx) bool { - txn, _ := db.Begin() - isPass := true - _, err := txn.Exec("INSERT INTO APP_CREDENTIAL (org, id, app_id, cons_secret, status, issued_at)VALUES(?,?,?,?,?,?);", - org, - ele.EntityIdentifier, - ele.PldCont.AppId, - ele.PldCont.ConsumerSecret, - ele.PldCont.Status, - ele.PldCont.IssuedAt) + var scope, id, appId, consumerSecret, appstatus, status, tenantId string + var issuedAt int64 + prep, err := txn.Prepare("INSERT INTO APP_CREDENTIAL (_apid_scope, id, app_id, consumer_secret, app_status, status, issued_at, tenant_id)VALUES($1,$2,$3,$4,$5,$6,$7,$8);") if err != nil { - isPass = false - log.Error("INSERT CRED Failed: ", ele.EntityIdentifier, org, ")", err) - goto OT - } else { - log.Info("INSERT CRED Success: (", ele.EntityIdentifier, org, ")") + log.Error("INSERT Cred Failed: ", err) + return false } - - /* - * If the credentials has been successfully inserted, insert the - * mapping entries associated with the credential - */ - - for _, elem := range ele.PldCont.ApiProducts { - - _, err = txn.Exec("INSERT INTO APP_AND_API_PRODUCT_MAPPER (org, api_prdt_id, app_id, app_cred_id, api_prdt_status) VALUES(?,?,?,?,?);", - org, - elem.ApiProduct, - ele.PldCont.AppId, - ele.EntityIdentifier, - elem.Status) + defer prep.Close() + for _, ele := range rows { + ele.Get("_apid_scope", &scope) + ele.Get("id", &id) + ele.Get("app_id", &appId) + ele.Get("consumer_secret", &consumerSecret) + ele.Get("app_status", &appstatus) + ele.Get("status", &status) + ele.Get("issued_at", &issuedAt) + ele.Get("tenant_id", &tenantId) + _, err = txn.Stmt(prep).Exec( + scope, + id, + appId, + consumerSecret, + appstatus, + status, + issuedAt, + tenantId) if err != nil { - isPass = false - log.Error("INSERT APP_AND_API_PRODUCT_MAPPER Failed: (", - org, - elem.ApiProduct, - ele.PldCont.AppId, - ele.EntityIdentifier, + log.Error("INSERT CRED Failed: ", id, ", ", scope, ")", err) + return false + } else { + log.Debug("INSERT CRED Success: (", id, ", ", scope, ")") + } + } + return true +} + +/* + * Performs Bulk insert of Applications + */ +func insertApplications(rows []common.Row, txn *sql.Tx) bool { + + var scope, EntityIdentifier, DeveloperId, CallbackUrl, Status, AppName, AppFamily, tenantId, CreatedBy, LastModifiedBy string + var CreatedAt, LastModifiedAt int64 + + prep, err := txn.Prepare("INSERT INTO APP (_apid_scope, id, developer_id,callback_url,status, name, app_family, created_at, created_by,updated_at, updated_by,tenant_id) VALUES($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12);") + if err != nil { + log.Error("INSERT APP Failed: ", err) + return false + } + + defer prep.Close() + for _, ele := range rows { + + ele.Get("_apid_scope", &scope) + ele.Get("id", &EntityIdentifier) + ele.Get("developer_id", &DeveloperId) + ele.Get("callback_url", &CallbackUrl) + ele.Get("status", &Status) + ele.Get("name", &AppName) + ele.Get("app_family", &AppFamily) + ele.Get("created_at", &CreatedAt) + ele.Get("created_by", &CreatedBy) + ele.Get("updated_at", &LastModifiedAt) + ele.Get("updated_by", &LastModifiedBy) + ele.Get("tenant_id", &tenantId) + + _, err = txn.Stmt(prep).Exec( + scope, + EntityIdentifier, + DeveloperId, + CallbackUrl, + Status, + AppName, + AppFamily, + CreatedAt, + CreatedBy, + LastModifiedAt, + LastModifiedBy, + tenantId) + + if err != nil { + log.Error("INSERT APP Failed: (", EntityIdentifier, ", ", tenantId, ")", err) + return false + } else { + log.Debug("INSERT APP Success: (", EntityIdentifier, ", ", tenantId, ")") + } + } + return true + +} + +/* + * Performs bulk insert of Developers + */ +func insertDevelopers(rows []common.Row, txn *sql.Tx) bool { + + var scope, EntityIdentifier, Email, Status, UserName, FirstName, LastName, tenantId, CreatedBy, LastModifiedBy, Username string + var CreatedAt, LastModifiedAt int64 + + prep, err := txn.Prepare("INSERT INTO DEVELOPER (_apid_scope,email,id,tenant_id,status,username,first_name,last_name,created_at,created_by,updated_at,updated_by) VALUES($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12);") + if err != nil { + log.Error("INSERT DEVELOPER Failed: ", err) + return false + } + + defer prep.Close() + for _, ele := range rows { + + ele.Get("_apid_scope", &scope) + ele.Get("email", &Email) + ele.Get("id", &EntityIdentifier) + ele.Get("tenant_id", &tenantId) + ele.Get("status", &Status) + ele.Get("username", &Username) + ele.Get("first_name", &FirstName) + ele.Get("last_name", &LastName) + ele.Get("created_at", &CreatedAt) + ele.Get("created_by", &CreatedBy) + ele.Get("updated_at", &LastModifiedAt) + ele.Get("updated_by", &LastModifiedBy) + + _, err = txn.Stmt(prep).Exec( + scope, + Email, + EntityIdentifier, + tenantId, + Status, + UserName, + FirstName, + LastName, + CreatedAt, + CreatedBy, + LastModifiedAt, + LastModifiedBy) + + if err != nil { + log.Error("INSERT DEVELOPER Failed: (", EntityIdentifier, ", ", scope, ")", err) + return false + } else { + log.Debug("INSERT DEVELOPER Success: (", EntityIdentifier, ", ", scope, ")") + } + } + return true +} + +/* + * Performs Bulk insert of API products + */ +func insertAPIproducts(rows []common.Row, txn *sql.Tx) bool { + + var scope, apiProduct, res, env, tenantId string + + prep, err := txn.Prepare("INSERT INTO API_PRODUCT (id, api_resources, environments, tenant_id,_apid_scope) VALUES($1,$2,$3,$4,$5)") + if err != nil { + log.Error("INSERT API_PRODUCT Failed: ", err) + return false + } + + defer prep.Close() + for _, ele := range rows { + + ele.Get("_apid_scope", &scope) + ele.Get("id", &apiProduct) + ele.Get("api_resources", &res) + ele.Get("environments", &env) + ele.Get("tenant_id", &tenantId) + + _, err = txn.Stmt(prep).Exec( + apiProduct, + res, + env, + tenantId, + scope) + + if err != nil { + log.Error("INSERT API_PRODUCT Failed: (", apiProduct, ", ", tenantId, ")", err) + return false + } else { + log.Debug("INSERT API_PRODUCT Success: (", apiProduct, ", ", tenantId, ")") + } + } + return true +} + +/* + * Performs a bulk insert of all APP_CREDENTIAL_APIPRODUCT_MAPPER rows + */ +func insertAPIProductMappers(rows []common.Row, txn *sql.Tx) bool { + + var ApiProduct, AppId, EntityIdentifier, tenantId, Scope, Status string + + prep, err := txn.Prepare("INSERT INTO APP_CREDENTIAL_APIPRODUCT_MAPPER(apiprdt_id, app_id, appcred_id, tenant_id, _apid_scope, status) VALUES($1,$2,$3,$4,$5,$6);") + if err != nil { + log.Error("INSERT APP_CREDENTIAL_APIPRODUCT_MAPPER Failed: ", err) + return false + } + + defer prep.Close() + for _, ele := range rows { + + ele.Get("apiprdt_id", &ApiProduct) + ele.Get("app_id", &AppId) + ele.Get("appcred_id", &EntityIdentifier) + ele.Get("tenant_id", &tenantId) + ele.Get("_apid_scope", &Scope) + ele.Get("status", &Status) + + /* + * If the credentials has been successfully inserted, insert the + * mapping entries associated with the credential + */ + + _, err = txn.Stmt(prep).Exec( + ApiProduct, + AppId, + EntityIdentifier, + tenantId, + Scope, + Status) + + if err != nil { + log.Error("INSERT APP_CREDENTIAL_APIPRODUCT_MAPPER Failed: (", + ApiProduct, ", ", + AppId, ", ", + EntityIdentifier, ", ", + tenantId, ", ", + Scope, ", ", + Status, ")", err) - break + + return false } else { - log.Info("INSERT APP_AND_API_PRODUCT_MAPPER Success: (", - org, - elem.ApiProduct, - ele.PldCont.AppId, - ele.EntityIdentifier, + log.Debug("INSERT APP_CREDENTIAL_APIPRODUCT_MAPPER Success: (", + ApiProduct, ", ", + AppId, ", ", + EntityIdentifier, ", ", + tenantId, ", ", + Scope, ", ", + Status, ")") } } -OT: - if isPass == true { - txn.Commit() - } else { - txn.Rollback() - } - return isPass + return true +} +func processChange(changes *common.ChangeList, txn *sql.Tx) bool { + + var rows []common.Row + res := true + + log.Debugf("apigeeSyncEvent: %d changes", len(changes.Changes)) + for _, payload := range changes.Changes { + rows = nil + switch payload.Table { + case "kms.developer": + switch payload.Operation { + case common.Insert: + rows = append(rows, payload.NewRow) + res = insertDevelopers(rows, txn) + + case common.Update: + res = deleteObject("DEVELOPER", payload.OldRow, txn) + rows = append(rows, payload.NewRow) + res = insertDevelopers(rows, txn) + + case common.Delete: + res = deleteObject("DEVELOPER", payload.OldRow, txn) + } + case "kms.app": + switch payload.Operation { + case common.Insert: + rows = append(rows, payload.NewRow) + res = insertApplications(rows, txn) + + case common.Update: + res = deleteObject("APP", payload.OldRow, txn) + rows = append(rows, payload.NewRow) + res = insertApplications(rows, txn) + + case common.Delete: + res = deleteObject("APP", payload.OldRow, txn) + } + + case "kms.app_credential": + switch payload.Operation { + case common.Insert: + rows = append(rows, payload.NewRow) + res = insertCredentials(rows, txn) + + case common.Update: + res = deleteObject("APP_CREDENTIAL", payload.OldRow, txn) + rows = append(rows, payload.NewRow) + res = insertCredentials(rows, txn) + + case common.Delete: + res = deleteObject("APP_CREDENTIAL", payload.OldRow, txn) + } + case "kms.api_product": + switch payload.Operation { + case common.Insert: + rows = append(rows, payload.NewRow) + res = insertAPIproducts(rows, txn) + + case common.Update: + res = deleteObject("API_PRODUCT", payload.OldRow, txn) + rows = append(rows, payload.NewRow) + res = insertAPIproducts(rows, txn) + + case common.Delete: + res = deleteObject("API_PRODUCT", payload.OldRow, txn) + } + + case "kms.app_credential_apiproduct_mapper": + switch payload.Operation { + case common.Insert: + rows = append(rows, payload.NewRow) + res = insertAPIProductMappers(rows, txn) + + case common.Update: + res = deleteAPIproductMapper(payload.OldRow, txn) + rows = append(rows, payload.NewRow) + res = insertAPIProductMappers(rows, txn) + + case common.Delete: + res = deleteAPIproductMapper(payload.OldRow, txn) + } + } + if res == false { + log.Error("Sql Operation error. Operation rollbacked") + return false + } + } + return true } /* - * DELETE CRED + * DELETE OBJECT as passed in the input */ -func deleteCredential(ele apidApigeeSync.DataPayload, db *sql.DB, org string) bool { +func deleteObject(object string, ele common.Row, txn *sql.Tx) bool { - txn, _ := db.Begin() - - _, err := txn.Exec("DELETE FROM APP_CREDENTIAL WHERE org=? AND id=?;", org, ele.EntityIdentifier) - + var scope, apiProduct string + ssql := "DELETE FROM " + object + " WHERE id = $1 AND _apid_scope = $2" + prep, err := txn.Prepare(ssql) if err != nil { - log.Error("DELETE CRED Failed: (", ele.EntityIdentifier, org, ")", err) - txn.Rollback() + log.Error("DELETE ", object, " Failed: ", err) + return false + } + defer prep.Close() + ele.Get("_apid_scope", &scope) + ele.Get("id", &apiProduct) + + _, err = txn.Stmt(prep).Exec(apiProduct, scope) + if err != nil { + log.Error("DELETE ", object, " Failed: (", apiProduct, ", ", scope, ")", err) return false } else { - log.Info("DELETE CRED Success: (", ele.EntityIdentifier, org, ")") - txn.Commit() + log.Debug("DELETE ", object, " Success: (", apiProduct, ", ", scope, ")") return true } } /* - * Helper function to convert string slice in to JSON format + * DELETE APIPRDT MAPPER */ -func convertSlicetoStringFormat(inpslice []string) string { +func deleteAPIproductMapper(ele common.Row, txn *sql.Tx) bool { + var ApiProduct, AppId, EntityIdentifier, apid_scope string - bytes, _ := json.Marshal(inpslice) - return string(bytes) -} - -/* - * INSERT INTO API product op - */ -func insertAPIproduct(ele apidApigeeSync.DataPayload, db *sql.DB, org string) bool { - - txn, _ := db.Begin() - restr := convertSlicetoStringFormat(ele.PldCont.Resources) - envstr := convertSlicetoStringFormat(ele.PldCont.Environments) - - _, err := txn.Exec("INSERT INTO API_PRODUCT (org, id, res_names, env) VALUES(?,?,?,?)", - org, - ele.PldCont.AppName, - restr, - envstr) - + prep, err := txn.Prepare("DELETE FROM APP_CREDENTIAL_APIPRODUCT_MAPPER WHERE apiprdt_id=$1 AND app_id=$2 AND appcred_id=$3 AND _apid_scope=$4;") if err != nil { - log.Error("INSERT API_PRODUCT Failed: (", ele.PldCont.AppName, org, ")", err) - txn.Rollback() + log.Error("DELETE APP_CREDENTIAL_APIPRODUCT_MAPPER Failed: ", err) return false - } else { - log.Info("INSERT API_PRODUCT Success: (", ele.PldCont.AppName, org, ")") - txn.Commit() - return true } -} + defer prep.Close() -/* - * INSERT INTO APP op - */ -func insertCreateApplication(ele apidApigeeSync.DataPayload, db *sql.DB, org string) bool { + ele.Get("apiprdt_id", &ApiProduct) + ele.Get("app_id", &AppId) + ele.Get("appcred_id", &EntityIdentifier) + ele.Get("_apid_scope", &apid_scope) - txn, _ := db.Begin() - - _, err := txn.Exec("INSERT INTO APP (org, id, dev_id,cback_url,status, name, app_family, created_at, created_by,updated_at, updated_by) VALUES(?,?,?,?,?,?,?,?,?,?,?);", - org, - ele.EntityIdentifier, - ele.PldCont.DeveloperId, - ele.PldCont.CallbackUrl, - ele.PldCont.Status, - ele.PldCont.AppName, - ele.PldCont.AppFamily, - ele.PldCont.CreatedAt, - ele.PldCont.CreatedBy, - ele.PldCont.LastModifiedAt, - ele.PldCont.LastModifiedBy) - + _, err = txn.Stmt(prep).Exec(ApiProduct, AppId, EntityIdentifier, apid_scope) if err != nil { - log.Error("INSERT APP Failed: (", ele.EntityIdentifier, org, ")", err) - txn.Rollback() + log.Error("DELETE APP_CREDENTIAL_APIPRODUCT_MAPPER Failed: (", + ApiProduct, ", ", + AppId, ", ", + EntityIdentifier, ", ", + apid_scope, + ")", + err) return false } else { - log.Info("INSERT APP Success: (", ele.EntityIdentifier, org, ")") - txn.Commit() + log.Debug("DELETE APP_CREDENTIAL_APIPRODUCT_MAPPER Success: (", + ApiProduct, ", ", + AppId, ", ", + EntityIdentifier, ", ", + apid_scope, + ")") return true } - -} - -/* - * INSERT INTO DEVELOPER op - */ -func insertCreateDeveloper(ele apidApigeeSync.DataPayload, db *sql.DB, org string) bool { - - txn, _ := db.Begin() - - _, err := txn.Exec("INSERT INTO DEVELOPER (org, email, id, sts, username, firstname, lastname, created_at,created_by, updated_at, updated_by) VALUES(?,?,?,?,?,?,?,?,?,?,?);", - org, - ele.PldCont.Email, - ele.EntityIdentifier, - ele.PldCont.Status, - ele.PldCont.UserName, - ele.PldCont.FirstName, - ele.PldCont.LastName, - ele.PldCont.CreatedAt, - ele.PldCont.CreatedBy, - ele.PldCont.LastModifiedAt, - ele.PldCont.LastModifiedBy) - - if err != nil { - log.Error("INSERT DEVELOPER Failed: (", ele.PldCont.UserName, org, ")", err) - txn.Rollback() - return false - } else { - log.Info("INSERT DEVELOPER Success: (", ele.PldCont.UserName, org, ")") - txn.Commit() - return true - } - }
diff --git a/listener_test.go b/listener_test.go index cb283d7..6a51136 100644 --- a/listener_test.go +++ b/listener_test.go
@@ -4,105 +4,251 @@ "encoding/json" "github.com/30x/apid" . "github.com/30x/apidApigeeSync" // for direct access to Payload types + "github.com/apigee-labs/transicator/common" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" ) +var count int = 0 var _ = Describe("listener", func() { It("should store data from ApigeeSync in the database", func(done Done) { - var event = ChangeSet{} - event.Changes = []ChangePayload{ + var event = common.ChangeList{} + var event2 = common.ChangeList{} + + /* API Product */ + srvItems := common.Row{} + scv := &common.ColumnVal{ + Value: "ch_api_product_0", + Type: 1, + } + srvItems["id"] = scv + + scv = &common.ColumnVal{ + Value: "{}", + Type: 1, + } + srvItems["api_resources"] = scv + + scv = &common.ColumnVal{ + Value: "{Env_0, Env_1}", + Type: 1, + } + srvItems["environments"] = scv + + scv = &common.ColumnVal{ + Value: "tenant_id_0", + Type: 1, + } + srvItems["tenant_id"] = scv + + scv = &common.ColumnVal{ + Value: "test_org0", + Type: 1, + } + srvItems["_apid_scope"] = scv + + /* DEVELOPER */ + devItems := common.Row{} + scv = &common.ColumnVal{ + Value: "ch_developer_id_0", + Type: 1, + } + devItems["id"] = scv + + scv = &common.ColumnVal{ + Value: "Active", + Type: 1, + } + devItems["status"] = scv + + scv = &common.ColumnVal{ + Value: "tenant_id_0", + Type: 1, + } + devItems["tenant_id"] = scv + + scv = &common.ColumnVal{ + Value: "test_org0", + Type: 1, + } + devItems["_apid_scope"] = scv + + /* APP */ + appItems := common.Row{} + scv = &common.ColumnVal{ + Value: "ch_application_id_0", + Type: 1, + } + appItems["id"] = scv + + scv = &common.ColumnVal{ + Value: "ch_developer_id_0", + Type: 1, + } + appItems["developer_id"] = scv + + scv = &common.ColumnVal{ + Value: "tenant_id_0", + Type: 1, + } + appItems["tenant_id"] = scv + + scv = &common.ColumnVal{ + Value: "Approved", + Type: 1, + } + appItems["status"] = scv + + scv = &common.ColumnVal{ + Value: "test_org0", + Type: 1, + } + appItems["_apid_scope"] = scv + + /* CRED */ + credItems := common.Row{} + scv = &common.ColumnVal{ + Value: "ch_app_credential_0", + Type: 1, + } + credItems["id"] = scv + + scv = &common.ColumnVal{ + Value: "ch_application_id_0", + Type: 1, + } + credItems["app_id"] = scv + + scv = &common.ColumnVal{ + Value: "tenant_id_0", + Type: 1, + } + credItems["tenant_id"] = scv + + scv = &common.ColumnVal{ + Value: "Approved", + Type: 1, + } + credItems["status"] = scv + + scv = &common.ColumnVal{ + Value: "test_org0", + Type: 1, + } + credItems["_apid_scope"] = scv + + /* APP_CRED_APIPRD_MAPPER */ + mpItems := common.Row{} + scv = &common.ColumnVal{ + Value: "ch_api_product_0", + Type: 1, + } + mpItems["apiprdt_id"] = scv + + scv = &common.ColumnVal{ + Value: "ch_application_id_0", + Type: 1, + } + mpItems["app_id"] = scv + + scv = &common.ColumnVal{ + Value: "ch_app_credential_0", + Type: 1, + } + mpItems["appcred_id"] = scv + + scv = &common.ColumnVal{ + Value: "Approved", + Type: 1, + } + mpItems["status"] = scv + + scv = &common.ColumnVal{ + Value: "test_org0", + Type: 1, + } + mpItems["_apid_scope"] = scv + + event.Changes = []common.Change{ { - Data: DataPayload{ - EntityType: "apiproduct", - Operation: "create", - PldCont: Payload{ - Organization: "test_org", - AppName: "Api_product_sync", - Resources: []string{"/**", "/test"}, - Environments: []string{"Env_0", "Env_1"}, - }, - }, + Table: "kms.api_product", + NewRow: srvItems, + Operation: 1, }, { - Data: DataPayload{ - EntityType: "developer", - Operation: "create", - EntityIdentifier: "developer_id_sync", - PldCont: Payload{ - Organization: "test_org", - Email: "person_sync@apigee.com", - Status: "Active", - UserName: "user_sync", - FirstName: "user_first_name_sync", - LastName: "user_last_name_sync", - }, - }, + Table: "kms.developer", + NewRow: devItems, + Operation: 1, }, { - Data: DataPayload{ - EntityType: "app", - Operation: "create", - EntityIdentifier: "application_id_sync", - PldCont: Payload{ - Organization: "test_org", - Email: "person_sync@apigee.com", - Status: "Approved", - AppName: "application_id_sync", - DeveloperId: "developer_id_sync", - CallbackUrl: "call_back_url", - }, - }, + Table: "kms.app", + NewRow: appItems, + Operation: 1, }, { - Data: DataPayload{ - EntityType: "credential", - Operation: "create", - EntityIdentifier: "credential_sync", - PldCont: Payload{ - Organization: "test_org", - AppId: "application_id_sync", - Status: "Approved", - ConsumerSecret: "consumer_secret_sync", - IssuedAt: 349583485, - ApiProducts: []Apip{ - { - ApiProduct: "Api_product_sync", - Status: "Approved", - }, - }, - }, - }, + Table: "kms.app_credential", + NewRow: credItems, + Operation: 1, + }, + { + Table: "kms.app_credential_apiproduct_mapper", + NewRow: mpItems, + Operation: 1, }, } + event2.Changes = []common.Change{ + { + Table: "kms.api_product", + OldRow: srvItems, + Operation: 3, + }, + { + Table: "kms.developer", + OldRow: devItems, + Operation: 3, + }, + { + Table: "kms.app", + OldRow: appItems, + Operation: 3, + }, + { + Table: "kms.app_credential", + OldRow: credItems, + Operation: 3, + }, + { + Table: "kms.app_credential_apiproduct_mapper", + OldRow: mpItems, + Operation: 3, + }, + } h := &test_handler{ - "checkDatabase", + "checkDatabase post Insertion", func(e apid.Event) { - // ignore the first event, let standard listener process it - changeSet := e.(*ChangeSet) + changeSet := e.(*common.ChangeList) if len(changeSet.Changes) > 0 { return } - - rsp, err := verifyAPIKey("credential_sync", "/test", "Env_0", "test_org", "verify") + rsp, err := verifyAPIKey("ch_app_credential_0", "/test", "Env_0", "test_org0", "verify") Expect(err).ShouldNot(HaveOccurred()) - var respj kmsResponseSuccess json.Unmarshal(rsp, &respj) Expect(respj.Type).Should(Equal("APIKeyContext")) - Expect(respj.RspInfo.Key).Should(Equal("credential_sync")) - + Expect(respj.RspInfo.Key).Should(Equal("ch_app_credential_0")) close(done) }, } apid.Events().Listen(ApigeeSyncEventSelector, h) - apid.Events().Emit(ApigeeSyncEventSelector, &event) // for standard listener - apid.Events().Emit(ApigeeSyncEventSelector, &ChangeSet{}) // for test listener + apid.Events().Emit(ApigeeSyncEventSelector, &event) + apid.Events().Emit(ApigeeSyncEventSelector, &event2) + apid.Events().Emit(ApigeeSyncEventSelector, &event) + apid.Events().Emit(ApigeeSyncEventSelector, &common.ChangeList{}) }) })
diff --git a/validate_env.go b/validate_env.go index df0382d..d90e27c 100644 --- a/validate_env.go +++ b/validate_env.go
@@ -1,15 +1,16 @@ package apidVerifyApiKey -import "encoding/json" +import "strings" /* * Ensure the ENV matches. */ -func validateEnv(envLocal, envInPath string) bool { +func validateEnv(envLocal string, envInPath string) bool { - var ePaths []string - json.Unmarshal([]byte(envLocal), &ePaths) - for _, a := range ePaths { + s := strings.TrimPrefix(envLocal, "{") + s = strings.TrimSuffix(s, "}") + fs := strings.Split(s, ",") + for _, a := range fs { if a == envInPath { return true }
diff --git a/validate_env_test.go b/validate_env_test.go index 3942d7a..268f9dd 100644 --- a/validate_env_test.go +++ b/validate_env_test.go
@@ -8,19 +8,19 @@ var _ = Describe("Validate Env", func() { It("validation1", func() { - s := validateEnv("[\"foo\",\"bar\"]", "foo") + s := validateEnv("{foo,bar}", "foo") Expect(s).Should(BeTrue()) }) It("validation2", func() { - s := validateEnv("[\"foo\",\"bar\"]", "bar") + s := validateEnv("{foo,bar}", "bar") Expect(s).Should(BeTrue()) }) It("validation3", func() { - s := validateEnv("[\"foo\",\"bar\"]", "xxx") + s := validateEnv("{foo,bar}", "xxx") Expect(s).Should(BeFalse()) }) It("validation4", func() { - s := validateEnv("[]", "xxx") + s := validateEnv("{}", "xxx") Expect(s).Should(BeFalse()) }) })
diff --git a/validate_path.go b/validate_path.go index f3cfb99..cd6e021 100644 --- a/validate_path.go +++ b/validate_path.go
@@ -1,7 +1,6 @@ package apidVerifyApiKey import ( - "encoding/json" "regexp" "strings" ) @@ -14,9 +13,10 @@ */ func validatePath(basePath, requestBase string) bool { - var basePaths []string - json.Unmarshal([]byte(basePath), &basePaths) - for _, a := range basePaths { + s := strings.TrimPrefix(basePath, "{") + s = strings.TrimSuffix(s, "}") + fs := strings.Split(s, ",") + for _, a := range fs { str1 := strings.Replace(a, "**", "(.*)", -1) str2 := strings.Replace(a, "*", "([^/]+)", -1) if a != str1 { @@ -39,7 +39,6 @@ * FIXME: SINGLE_FORWARD_SLASH_PATTERN not supported yet */ } - /* if the i/p resource is empty, no checks need to be made */ - return len(basePaths) == 0 + return s == "" }
diff --git a/validate_path_test.go b/validate_path_test.go index 0b76b07..a5e5e63 100644 --- a/validate_path_test.go +++ b/validate_path_test.go
@@ -16,79 +16,79 @@ Expect(s).Should(BeTrue()) }) It("validation3", func() { - s := validatePath("[]", "foo") + s := validatePath("{}", "foo") Expect(s).Should(BeTrue()) }) It("validation4", func() { - s := validatePath("[\"/**\"]", "/foo") + s := validatePath("{/**}", "/foo") Expect(s).Should(BeTrue()) }) It("validation5", func() { - s := validatePath("[\"/**\"]", "foo") + s := validatePath("{/**}", "foo") Expect(s).Should(BeFalse()) }) It("validation6", func() { - s := validatePath("[\"/**\"]", "/") + s := validatePath("{/**}", "/") Expect(s).Should(BeTrue()) }) It("validation7", func() { - s := validatePath("[\"/foo/**\"]", "/") + s := validatePath("{/foo/**}", "/") Expect(s).Should(BeFalse()) }) It("validation8", func() { - s := validatePath("[\"/foo/**\"]", "/foo/") + s := validatePath("{/foo/**}", "/foo/") Expect(s).Should(BeTrue()) }) It("validation9", func() { - s := validatePath("[\"/foo/**\"]", "/foo/bar") + s := validatePath("{/foo/**}", "/foo/bar") Expect(s).Should(BeTrue()) }) It("validation10", func() { - s := validatePath("[\"/foo/**\"]", "foo") + s := validatePath("{/foo/**}", "foo") Expect(s).Should(BeFalse()) }) It("validation11", func() { - s := validatePath("[\"/foo/bar/**\"]", "/foo/bar/xx/yy") + s := validatePath("{/foo/bar/**}", "/foo/bar/xx/yy") Expect(s).Should(BeTrue()) }) It("validation12", func() { - s := validatePath("[\"/foo/bar/*\"]", "/foo/bar/xxx") + s := validatePath("/foo/bar/*}", "/foo/bar/xxx") Expect(s).Should(BeTrue()) }) It("validation13", func() { - s := validatePath("[\"/foo/bar/*/\"]", "/foo/bar/xxx") + s := validatePath("{/foo/bar/*/}", "/foo/bar/xxx") Expect(s).Should(BeFalse()) }) It("validation14", func() { - s := validatePath("[\"/foo/bar/**\"]", "/foo/bar/xx/yy") + s := validatePath("{/foo/bar/**}", "/foo/bar/xx/yy") Expect(s).Should(BeTrue()) }) It("validation15", func() { - s := validatePath("[\"/foo/*/**/\"]", "/foo/bar") + s := validatePath("{/foo/*/**/}", "/foo/bar") Expect(s).Should(BeFalse()) }) It("validation16", func() { - s := validatePath("[\"/foo/bar/*/xxx\"]", "/foo/bar/yyy/xxx") + s := validatePath("{/foo/bar/*/xxx}", "/foo/bar/yyy/xxx") Expect(s).Should(BeTrue()) }) It("validation17", func() { - s := validatePath("[\"/foo/bar/*/xxx/\"]", "/foo/bar/yyy/xxx") + s := validatePath("{/foo/bar/*/xxx/}", "/foo/bar/yyy/xxx") Expect(s).Should(BeFalse()) }) It("validation18", func() { - s := validatePath("[\"/foo/bar/**/xxx/\"]", "/foo/bar/aaa/bbb/xxx/") + s := validatePath("{/foo/bar/**/xxx/}", "/foo/bar/aaa/bbb/xxx/") Expect(s).Should(BeTrue()) }) It("validation19", func() { - s := validatePath("[\"/foo/bar/***/xxx/\"]", "/foo/bar/aaa/bbb/xxx/") + s := validatePath("{/foo/bar/***/xxx/}", "/foo/bar/aaa/bbb/xxx/") Expect(s).Should(BeTrue()) }) It("validation20", func() { - s := validatePath("[\"/foo/\", \"/bar/\"]", "/foo/") + s := validatePath("{/foo/, /bar/}", "/foo/") Expect(s).Should(BeTrue()) }) It("validation21", func() { - s := validatePath("[\"/foo/bar/yy*/xxx\"]", "/foo/bar/yyy/xxx") + s := validatePath("{/foo/bar/yy*/xxx}", "/foo/bar/yyy/xxx") Expect(s).Should(BeTrue()) }) })