user:kluong:feature_idea_-_staging_environment

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
user:kluong:feature_idea_-_staging_environment [2021/10/21 02:16]
kluong [Gateway Changes]
user:kluong:feature_idea_-_staging_environment [2021/10/23 17:42] (current)
kluong
Line 181: Line 181:
  
 **Note** - be sure to take care when using sudo! This gives you access to do a lot of things to the existing system, including removing system files that you normally wouldn'​t be able to. **Note** - be sure to take care when using sudo! This gives you access to do a lot of things to the existing system, including removing system files that you normally wouldn'​t be able to.
 +
 +To check the users, use the ''​%%\du%%''​ command in postgres:
 +
 +<​code>​
 +postgres=# \du
 +                                   List of roles
 +       Role name       ​| ​                  ​Attributes ​                  | Member of
 +-----------------------+------------------------------------------------+-----------
 + ​control_tower ​        ​| ​                                               | {}
 + ​control_tower_ro ​     |                                                | {}
 + ​control_tower_staging |                                                | {}
 + ​kluong ​               |                                                | {}
 + ​postgres ​             | Superuser, Create role, Create DB, Replication | {}
 +</​code>​
 +
 +To check the databases, use the ''​%%\l%%''​ command in postgres:
 +
 +<​code>​
 +postgres-#
 +postgres-# \l
 +                                         List of databases
 +     ​Name ​     |     ​Owner ​    | Encoding |   ​Collate ​  ​| ​   Ctype    |      Access privileges
 +---------------+---------------+----------+-------------+-------------+-----------------------------
 + ​bears ​        | control_tower | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 + ​control_tower | postgres ​     | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =Tc/​postgres ​              +
 +               ​| ​              ​| ​         |             ​| ​            | postgres=CTc/​postgres ​     +
 +               ​| ​              ​| ​         |             ​| ​            | control_tower=CTc/​postgres +
 +               ​| ​              ​| ​         |             ​| ​            | control_tower_ro=c/​postgres
 + ​kluong ​       | postgres ​     | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =Tc/​postgres ​              +
 +               ​| ​              ​| ​         |             ​| ​            | postgres=CTc/​postgres ​     +
 +               ​| ​              ​| ​         |             ​| ​            | kluong=CTc/​postgres
 + ​postgres ​     | postgres ​     | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 + ​template0 ​    | postgres ​     | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/​postgres ​               +
 +               ​| ​              ​| ​         |             ​| ​            | postgres=CTc/​postgres
 + ​template1 ​    | postgres ​     | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/​postgres ​               +
 +               ​| ​              ​| ​         |             ​| ​            | postgres=CTc/​postgres
 +</​code>​
 +
 +
 +
  
 === Populating the tables === === Populating the tables ===
Line 197: Line 237:
  
 <​code>​ <​code>​
-psql -U control_tower_staging -d control_tower_staging -c "SHOW TABLES"+psql -U control_tower_staging -d control_tower_staging -c "SELECT * FROM pg_catalog.pg_tables WHERE schemaname='​public'​"
 </​code>​ </​code>​
  
  
  
- +==== Gateway ​Change - ability to pass in a database URI ====
-==== Gateway ​Changes ​====+
  
 I mentioned earlier we'll have to change the way the gateway works. This is the way the current code connects to the database: I mentioned earlier we'll have to change the way the gateway works. This is the way the current code connects to the database:
Line 222: Line 261:
 </​code>  ​ </​code>  ​
  
-We can also use a URI instead of passing in the arguments in the way we did previously. A shell script that calls the gateway would look something like this:+We can also use a URI instead of passing in the arguments in the way we did previously. A shell script that calls the gateway would look something like this for staging:
  
 <​code>​ <​code>​
 #!/bin/bash #!/bin/bash
  
-GATEWAY_DB_URI="​postgresql://​control_tower_staging@localhost/​control_tower_staging"​ python gateway.py+# setup the python env 
 +source ./​env/​bin/​activate  
 + 
 +export ​GATEWAY_DB_URI="​postgresql://​control_tower_staging@localhost/​control_tower_staging"​ 
 +python gateway.py ​/​dev/​serial/​by-id/​usb-FTDI_FT231X_USB_UART_DN01DS3L-if00-port0
 </​code>​ </​code>​
  
-To get this to work in production, you would have to modify the run_production.sh script, and also update the repository ​in production.+You'd need to see some RX frames on the tty device to test this properly though, since the gateway doesn'​t reach out to the database unless it sees a message to decode.  
 + 
 +To get this to work in production, you would have to modify the run_production.sh script, and also update the repository production. 
 + 
 + 
 +==== Gateway - testing changes ==== 
 +  
 +Options for testing 
 + 
 +  * Deploy to production - see what happens 
 +  * Deploy to staging - see what happens 
 +  * Setup an personal network (on your laptop, or maybe on the server) 
 +  * Connect the gateway to a "​fake"​ xbee virtually, using a pty and another script 
 +  * Mock out the serial device completely in python 
 + 
 +It's not necessarily practical to have hardware to test with all of the time and often hardware might not be available anyways. Luckily, with software we can work around this.  
 + 
 +**Note: development for the gateway should generally be done in a linux-based environment.** The gateway code was primarily designed only for linux-based environments and may not run locally. 
 + 
 +You can make a "​fake"​ xbee network using the following python script: 
 + 
 +<​code>​ 
 +import os 
 +import errno 
 +import time 
 + 
 +def symlink_force(target,​ link_name):​ 
 +    try: 
 +        os.symlink(target,​ link_name) 
 +    except OSError as e: 
 +        if e.errno == errno.EEXIST:​ 
 +            os.remove(link_name) 
 +            os.symlink(target,​ link_name) 
 +        else: 
 +            raise e 
 + 
 +def valid_packets():​ 
 +    packets = {} 
 +    packets['​heartbeat'​] = "​\x7e\x00\x16\x90\x00\x7d\x33\xa2\x00\x40\xe6\x4b\x5e\x03\xfd\x01\x00\x00\xff\xff\xf0\xfa\x23\x00\x2b\x02\xb2"​ 
 +    packets['​apple'​] = "​\x7e\x00\x22\x90\x00\x7d\x33\xa2\x00\x40\x9f\x27\xa7\x29\x6c\x01\x01\x00\xff\xff\x80\x6f\x69\x3d\x06\x0f\x71\x7d\x33\x5a\x8a\x01\x00\x76\x01\x22\x00\x6e\x09\x55"​ 
 +    packets['​cranberry'​] = "​\x7e\x00\x22\x90\x00\x7d\x33\xa2\x00\x41\x25\xe5\x88\x0c\x83\x01\x02\x00\xff\xff\x7c\xf3\x05\x00\xba\x0f\x5c\x08\x05\x00\x20\x73\x3b\x00\xdd\x8b\x01\x00\x7a"​ 
 +    packets['​dragonfruit'​] = "​\x7e\x00\x24\x90\x00\x7d\x33\xa2\x00\x40\xe6\x72\x7d\x5e\x30\x18\x01\x03\x00\xff\xff\x30\xc8\x07\x00\x6b\x0d\xf4\x00\x06\x00\x00\x00\xb6\x72\x37\x00\xfe\x8b\x01\x00\x00"​ 
 +    packets['​snapdragon'​] = "​\x7e\x00\x22\x90\x00\x7d\x33\xa2\x00\x40\xa3\x53\x7d\x5e\x20\x9c\x01\x04\x00\xff\xff\x12\xe4\x49\x00\xca\x0d\x44\x0c\x2c\x31\x01\x00\x2f\x01\x34\x00\x64\x00\xbb"​ 
 + 
 +    return packets 
 + 
 +master_fd, slave_fd = os.openpty() 
 +symlink_force(os.ttyname(slave_fd),​ '/​tmp/​fakexbee'​) 
 + 
 + 
 +packets = valid_packets() 
 +while True: 
 +    for key in packets: 
 +        os.write(master_fd,​ bytes(packets[key])) 
 +        time.sleep(1) 
 + 
 +</​code>​ 
 + 
  • user/kluong/feature_idea_-_staging_environment.1634782576.txt.gz
  • Last modified: 2021/10/21 02:16
  • by kluong