Skip to content

Commit 458e3cf

Browse files
author
vikasrohit
authored
Merge pull request #6 from topcoder-platform/feature/use-projects-api
Prod Deploy hotfix - use projects api
2 parents 67f97a8 + 94fdad1 commit 458e3cf

17 files changed

+266
-168
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,4 @@ node_modules
55
.env
66
.nyc_output
77
coverage/
8+
docker/api.env

ReadMe.md

Lines changed: 26 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,8 @@
33
## Dependencies
44

55
- nodejs https://nodejs.org/en/ (v8)
6-
- Kafka
6+
- Kafka
77
- Informix
8-
- Postgres
98
- Docker, Docker Compose
109

1110
## Configuration
@@ -21,13 +20,19 @@ The following parameters can be set in config files or in env variables:
2120
if not provided, then SSL connection is not used, direct insecure connection is used;
2221
if provided, it can be either path to private key file or private key content
2322
- KAFKA_GROUP_ID: the Kafka group id, default value is 'legacy-project-processor'
24-
- CREATE_PROJECT_TOPIC: create project Kafka topic, default value is 'project.notification.create'
25-
- UPDATE_PROJECT_TOPIC: update project Kafka topic, default value is 'project.notification.update'
26-
- DELETE_PROJECT_TOPIC: delete project member Kafka topic, default value is 'project.notification.delete'
23+
- CREATE_PROJECT_TOPIC: create project Kafka topic, default value is 'project.action.create'
24+
- UPDATE_PROJECT_TOPIC: update project Kafka topic, default value is 'project.action.update'
25+
- DELETE_PROJECT_TOPIC: delete project member Kafka topic, default value is 'project.action.delete'
2726
- INFORMIX: Informix database configuration parameters, refer `config/default.js` for more information
28-
- POSTGRES: Postgres database configuration parameters, refer `config/default.js` for more information
27+
- AUTH0_URL: AUTH0 URL, used to get M2M token
28+
- AUTH0_PROXY_SERVER_URL: AUTH0 proxy server URL, used to get M2M token
29+
- AUTH0_AUDIENCE: AUTH0 audience, used to get M2M token
30+
- TOKEN_CACHE_TIME: AUTH0 token cache time, used to get M2M token
31+
- AUTH0_CLIENT_ID: AUTH0 client id, used to get M2M token
32+
- AUTH0_CLIENT_SECRET: AUTH0 client secret, used to get M2M token
33+
- PROJECTS_API: the topcoder projects API
2934

30-
generally, we only need to update INFORMIX_HOST, KAFKA_URL and POSTGRES_URL via environment variables, see INFORMIX_HOST, KAFKA_URL and POSTGRES_URL parameter in docker/sample.api.env
35+
generally, we only need to update INFORMIX_HOST, KAFKA_URL, PROJECTS_API and M2M-related configuration via environment variables, see the parameters in docker/sample.api.env
3136

3237
There is a `/health` endpoint that checks for the health of the app. This sets up an expressjs server and listens on the environment variable `PORT`. It's not part of the configuration file and needs to be passed as an environment variable
3338

@@ -47,38 +52,27 @@ Configuration for the tests is at `config/test.js`, only add such new configurat
4752
`bin/kafka-server-start.sh config/server.properties`
4853
- note that the zookeeper server is at localhost:2181, and Kafka server is at localhost:9092
4954
- use another terminal, go to same directory, create the needed topics:
50-
`bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic project.notification.create`
55+
`bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic project.action.create`
5156

52-
`bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic project.notification.update`
57+
`bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic project.action.update`
5358

54-
`bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic project.notification.delete`
59+
`bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic project.action.delete`
5560

5661
- verify that the topics are created:
5762
`bin/kafka-topics.sh --list --zookeeper localhost:2181`,
5863
it should list out the created topics
59-
- run the producer and then write some message into the console to send to the `project.notification.create` topic:
64+
- run the producer and then write some message into the console to send to the `project.action.create` topic:
6065
in the console, write message, one message per line:
61-
`{ "topic": "project.notification.create", "originator": "project-api", "timestamp": "2018-07-02T00:00:00", "mime-type": "application/json", "payload": { "resource": "project", "id": 1000, "name": "Develop website", "description": "<h>Test</h><p>This is description</p>", "type": "Develop website", "directProjectId": null, "billingAccountId": 70015983, "type": "Web Application", "createdBy": 8547899 } }`
66+
`{ "topic": "project.action.create", "originator": "project-api", "timestamp": "2018-07-02T00:00:00", "mime-type": "application/json", "payload": { "resource": "project", "id": 1000, "name": "Develop website", "description": "<h>Test</h><p>This is description</p>", "type": "Develop website", "directProjectId": null, "billingAccountId": 70015983, "type": "Web Application", "createdBy": 8547899 } }`
6267
- optionally, use another terminal, go to same directory, start a consumer to view the messages:
63-
`bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic project.notification.create --from-beginning`
68+
`bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic project.action.create --from-beginning`
6469
- writing/reading messages to/from other topics are similar
6570

6671
## Topcoder Informix Database Setup
6772
We will use Topcoder Informix database setup on Docker.
6873

6974
Go to `docker-ifx` folder and run `docker-compose up`
7075

71-
## Postgres database setup
72-
73-
- Checkout tc-project-service `v5-upgrade` branch
74-
```bash
75-
git clone https://github.com/topcoder-platform/tc-project-service.git
76-
git checkout v5-upgrade
77-
```
78-
- Modify `dbConfig.masterUrl` in `config/default.json`
79-
- Run command `npm install` to install dependencies
80-
- Run command `npm run sync:db` to create tables on Postgres database
81-
8276
## Local deployment
8377
- Given the fact that the library used to access Informix DB depends on Informix Client SDK.
8478
We will run the application on Docker using a base image with Informix Client SDK installed and properly configured.
@@ -88,28 +82,30 @@ For deployment, please refer to next section 'Local Deployment with Docker'
8882

8983
To run the Legacy Project Processor using docker, follow the steps below
9084

91-
1. Make sure that Kafka, Postgres and Informix are running as per instructions above.
85+
1. Make sure that Kafka, Project Service and Informix are running as per instructions above.
9286

9387
2. Go to `docker` folder
9488

95-
3. Rename the file `sample.api.env` to `api.env` And properly update the IP addresses to match your environment for the variables : KAFKA_URL, INFORMIX_HOST and POSTGRES_URL( make sure to use IP address instead of hostname ( i.e localhost will not work)).Here is an example:
89+
3. Rename the file `sample.api.env` to `api.env` and uncomment lines `env_file:` and `- api.env` in `docker-compose.yml`.
90+
91+
4. Properly update M2M-related configuration and the IP addresses to match your environment for the variables : KAFKA_URL, INFORMIX_HOST and PROJECTS_API ( make sure to use IP address instead of hostname ( i.e localhost will not work)).Here is an example:
9692
```
9793
KAFKA_URL=192.168.31.8:9092
9894
INFORMIX_HOST=192.168.31.8
99-
POSTGRES_URL=postgres://postgres:password@192.168.31.8:5432/postgres
95+
PROJECTS_API=192.168.31.8:8001/v5
10096
```
10197

102-
4. Once that is done, go to run the following command
98+
5. Once that is done, go to run the following command
10399

104100
```
105101
docker-compose up
106102
```
107103

108-
5. When you are running the application for the first time, It will take some time initially to download the image and install the dependencies
104+
6. When you are running the application for the first time, It will take some time initially to download the image and install the dependencies
109105

110106
## Running e2e tests
111107
You need to run `docker-compose build` if modify source files.
112-
Make sure run `docker-compose up` in `docker` folder once to make sure application will install dependencies and run successfully with Kafka, Postgres and Informix.
108+
Make sure run `docker-compose up` in `docker` folder once to make sure application will install dependencies and run successfully with Kafka and Informix.
113109

114110
To run e2e tests
115111
Modify `docker/docker-compose.yml` with `command: run test`(uncomment it) and run `docker-compose up` in `docker` folder

Verification.md

Lines changed: 44 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -15,45 +15,45 @@ npm run test-data
1515
```
1616

1717
## Verification
18-
1. start kafka-console-producer to write messages to `project.notification.create` topic:
19-
`bin/kafka-console-producer.sh --broker-list localhost:9092 --topic project.notification.create`
18+
1. start kafka-console-producer to write messages to `project.action.create` topic:
19+
`bin/kafka-console-producer.sh --broker-list localhost:9092 --topic project.action.create`
2020
2. write message:
21-
`{ "topic": "project.notification.create", "originator": "project-api", "timestamp": "2018-07-02T00:00:00", "mime-type": "application/json", "payload": { "resource": "project", "id": 1000, "name": "Develop website", "description": "<h>Test</h><p>This is description</p>", "directProjectId": null, "billingAccountId": 70015983, "type": "Web Application", "createdBy": 132458 } }`
21+
`{ "topic": "project.action.create", "originator": "project-api", "timestamp": "2018-07-02T00:00:00", "mime-type": "application/json", "payload": { "resource": "project", "id": 1, "name": "Develop website", "description": "<h>Test</h><p>This is description</p>", "directProjectId": null, "billingAccountId": 70015983, "type": "Web Application", "createdBy": 132458 } }`
2222
3. check the app console to verify message has been properly handled.
2323
4. Again, write another message(directProjectId is provided at this time):
24-
`{ "topic": "project.notification.create", "originator": "project-api", "timestamp": "2018-07-02T00:00:00", "mime-type": "application/json", "payload": { "resource": "project", "id": 1001, "name": "<h1>Test Project</h1>", "description": "<h>Test</h><p>This is description</p>", "directProjectId": 500, "billingAccountId": null, "type": "Web", "createdBy": 132458 } }`
24+
`{ "topic": "project.action.create", "originator": "project-api", "timestamp": "2018-07-02T00:00:00", "mime-type": "application/json", "payload": { "resource": "project", "id": 2, "name": "<h1>Test Project</h1>", "description": "<h>Test</h><p>This is description</p>", "directProjectId": 500, "billingAccountId": null, "type": "Web", "createdBy": 132458 } }`
2525
5. check the app console to verify message has been properly handled.
2626
6. Try to write an invalid message:
27-
`{ "topic": "project.notification.create", "originator": "project-api", "timestamp": "2018-07-02T00:00:00", "mime-type": "application/json", "payload": { "resource": "project", "id": 1001, "name": "<h1>Test Project</h1>", "description": "<h>Test</h><p>This is description</p>", "directProjectId": 500, "billingAccountId": 100, "type": "Web", "createdBy": 132458 } }`
27+
`{ "topic": "project.action.create", "originator": "project-api", "timestamp": "2018-07-02T00:00:00", "mime-type": "application/json", "payload": { "resource": "project", "id": 2, "name": "<h1>Test Project</h1>", "description": "<h>Test</h><p>This is description</p>", "directProjectId": 500, "billingAccountId": 100, "type": "Web", "createdBy": 132458 } }`
2828
7. You will see error message in the app console.
29-
8. start kafka-console-producer to write messages to `project.notification.update` topic:
30-
`bin/kafka-console-producer.sh --broker-list localhost:9092 --topic project.notification.update`
29+
8. start kafka-console-producer to write messages to `project.action.update` topic:
30+
`bin/kafka-console-producer.sh --broker-list localhost:9092 --topic project.action.update`
3131
9. write message:
32-
`{ "topic": "project.notification.update", "originator": "project-api", "timestamp": "2018-07-02T00:00:00", "mime-type": "application/json", "payload": { "resource": "project", "id": 1001, "directProjectId": 500, "billingAccountId": 70015984, "updatedBy": 132458 } }`
32+
`{ "topic": "project.action.update", "originator": "project-api", "timestamp": "2018-07-02T00:00:00", "mime-type": "application/json", "payload": { "resource": "project", "id": 2, "directProjectId": 500, "billingAccountId": 70015984, "updatedBy": 132458 } }`
3333
10. check the app console to verify message has been properly handled.
3434
11. Try to write an invalid message:
35-
`{ "topic": "project.notification.update", "originator": "project-api", "timestamp": "2018-07-02T00:00:00", "mime-type": "application/json", "payload": { "resource": "project", "id": 1001, "directProjectId": 500, "billingAccountId": 1, "updatedBy": 132458 } }`
35+
`{ "topic": "project.action.update", "originator": "project-api", "timestamp": "2018-07-02T00:00:00", "mime-type": "application/json", "payload": { "resource": "project", "id": 2, "directProjectId": 500, "billingAccountId": 1, "updatedBy": 132458 } }`
3636
12. You will see error message in the app console.
37-
13. start kafka-console-producer to write messages to `project.notification.update` topic:
38-
`bin/kafka-console-producer.sh --broker-list localhost:9092 --topic project.notification.create`
37+
13. start kafka-console-producer to write messages to `project.action.update` topic:
38+
`bin/kafka-console-producer.sh --broker-list localhost:9092 --topic project.action.create`
3939
14. write messages:
40-
`{ "topic": "project.notification.create", "originator": "project-api", "timestamp": "2018-07-02T00:00:00", "mime-type": "application/json", "payload": { "resource": "project.member", "projectId": 1001, "userId": 132457, "role": "copilot", "createdBy": 132458 } }`
40+
`{ "topic": "project.action.create", "originator": "project-api", "timestamp": "2018-07-02T00:00:00", "mime-type": "application/json", "payload": { "resource": "project.member", "projectId": 2, "userId": 132457, "role": "copilot", "createdBy": 132458 } }`
4141

42-
`{ "topic": "project.notification.create", "originator": "project-api", "timestamp": "2018-07-02T00:00:00", "mime-type": "application/json", "payload": { "resource": "project.member", "projectId": 1001, "userId": 124835, "role": "manager", "createdBy": 132458 } }`
42+
`{ "topic": "project.action.create", "originator": "project-api", "timestamp": "2018-07-02T00:00:00", "mime-type": "application/json", "payload": { "resource": "project.member", "projectId": 2, "userId": 124835, "role": "manager", "createdBy": 132458 } }`
4343

44-
`{ "topic": "project.notification.create", "originator": "project-api", "timestamp": "2018-07-02T00:00:00", "mime-type": "application/json", "payload": { "resource": "project.member", "projectId": 1001, "userId": 124836, "role": "account_manager", "createdBy": 132458 } }`
44+
`{ "topic": "project.action.create", "originator": "project-api", "timestamp": "2018-07-02T00:00:00", "mime-type": "application/json", "payload": { "resource": "project.member", "projectId": 2, "userId": 124836, "role": "account_manager", "createdBy": 132458 } }`
4545

4646
15. check the app console to verify messages has been properly handled.
4747
16. Repeat step 14 again.
4848
17. You will see error messages in the app console.
49-
18. start kafka-console-producer to write messages to `project.notification.update` topic:
50-
`bin/kafka-console-producer.sh --broker-list localhost:9092 --topic project.notification.delete`
49+
18. start kafka-console-producer to write messages to `project.action.update` topic:
50+
`bin/kafka-console-producer.sh --broker-list localhost:9092 --topic project.action.delete`
5151
19. write messages:
52-
`{ "topic": "project.notification.delete", "originator": "project-api", "timestamp": "2018-07-02T00:00:00", "mime-type": "application/json", "payload": { "resource": "project.member", "projectId": 1001, "userId": 132457, "role": "copilot", "deletedBy": 132458 } }`
52+
`{ "topic": "project.action.delete", "originator": "project-api", "timestamp": "2018-07-02T00:00:00", "mime-type": "application/json", "payload": { "resource": "project.member", "projectId": 2, "userId": 132457, "role": "copilot", "deletedBy": 132458 } }`
5353

54-
`{ "topic": "project.notification.delete", "originator": "project-api", "timestamp": "2018-07-02T00:00:00", "mime-type": "application/json", "payload": { "resource": "project.member", "projectId": 1001, "userId": 124835, "role": "manager", "deletedBy": 132458 } }`
54+
`{ "topic": "project.action.delete", "originator": "project-api", "timestamp": "2018-07-02T00:00:00", "mime-type": "application/json", "payload": { "resource": "project.member", "projectId": 2, "userId": 124835, "role": "manager", "deletedBy": 132458 } }`
5555

56-
`{ "topic": "project.notification.delete", "originator": "project-api", "timestamp": "2018-07-02T00:00:00", "mime-type": "application/json", "payload": { "resource": "project.member", "projectId": 1001, "userId": 124836, "role": "account_manager", "deletedBy": 132458 } }`
56+
`{ "topic": "project.action.delete", "originator": "project-api", "timestamp": "2018-07-02T00:00:00", "mime-type": "application/json", "payload": { "resource": "project.member", "projectId": 2, "userId": 124836, "role": "account_manager", "deletedBy": 132458 } }`
5757

5858
20. check the app console to verify messages has been properly handled.
5959
21. Repeat step 14 again.
@@ -77,20 +77,29 @@ select * from projects;
7777

7878
## E2E tests coverage
7979

80-
103 passing (3m)
80+
``` code
81+
103 passing (2m)
8182
82-
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s
83-
----------------------|----------|----------|----------|----------|------------------
84-
All files | 98.23 | 91.98 | 100 | 98.21 |
85-
config | 100 | 89.74 | 100 | 100 |
86-
default.js | 100 | 89.74 | 100 | 100 | 8,25,36
87-
test.js | 100 | 100 | 100 | 100 |
88-
src | 98.57 | 85 | 100 | 98.51 |
89-
app.js | 98.41 | 85 | 100 | 98.39 | 85
90-
bootstrap.js | 100 | 100 | 100 | 100 |
91-
constants.js | 100 | 100 | 100 | 100 |
92-
src/common | 92.59 | 70.83 | 100 | 92.59 |
93-
helper.js | 100 | 100 | 100 | 100 |
94-
logger.js | 90.63 | 65 | 100 | 90.63 |32,55,60,84,98,118
95-
src/services | 99.67 | 99.04 | 100 | 99.66 |
96-
ProcessorService.js | 99.67 | 99.04 | 100 | 99.66 | 875
83+
84+
> legacy-project-processor@1.0.0 cover:report /legacy-project-processor
85+
> nyc report --reporter=html --reporter=text
86+
87+
----------------------|----------|----------|----------|----------|-------------------|
88+
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s |
89+
----------------------|----------|----------|----------|----------|-------------------|
90+
All files | 96.75 | 91.01 | 96.72 | 96.72 | |
91+
config | 100 | 93.75 | 100 | 100 | |
92+
default.js | 100 | 93.75 | 100 | 100 | 8,25 |
93+
test.js | 100 | 100 | 100 | 100 | |
94+
src | 90 | 75 | 71.43 | 89.55 | |
95+
app.js | 88.89 | 75 | 60 | 88.71 |... 87,88,89,90,92 |
96+
bootstrap.js | 100 | 100 | 100 | 100 | |
97+
constants.js | 100 | 100 | 100 | 100 | |
98+
src/common | 92.5 | 70.83 | 100 | 92.5 | |
99+
helper.js | 100 | 100 | 100 | 100 | |
100+
logger.js | 90.63 | 65 | 100 | 90.63 |32,55,60,84,98,118 |
101+
src/services | 99.35 | 98.04 | 100 | 99.35 | |
102+
ProcessorService.js | 99.33 | 98.04 | 100 | 99.33 | 712,882 |
103+
ProjectService.js | 100 | 100 | 100 | 100 | |
104+
----------------------|----------|----------|----------|----------|-------------------|
105+
```

0 commit comments

Comments
 (0)