This core plugin for apid connects to the Apigee Change Agent and publishes the data changes events onto the apid Event service. It also coordinates DB initialization for plugins on startup.
name | description |
---|---|
apigeesync_poll_interval | int. seconds. default: 5 |
apigeesync_proxy_server_base | string. url. required. |
apigeesync_consumer_key | string. required. |
apigeesync_consumer_secret | string. required. |
apigeesync_instance_name | string. optional. Display Name for UI |
This plugin also populates a configuration item for dependant plugins that may need it:
name | description |
---|---|
apigeesync_apid_instance_id | string |
- Selector: "ApigeeSync"
- Data: payload.go
- Read DB version (Snapshot.SnapshotInfo) from default DB
- If version found, emit Snapshot event (using Snapshot.SnapshotInfo, no data)
- Ask server for Snapshot
- Each time a Snapshot is received
- Verify Snapshot.SnapshotInfo is different than current
- Stop processing change events
- Remove or clean new DB version if it exists
- Emit Snapshot event
- Wait for plugins to finish processing
- Save Snapshot.SnapshotInfo in default DB
- Release old DB version
- Start processing change events
- Initialization
- Until receiving first Snapshot message, ApigeeSync-dependent APIs must either:
- not register (endpoint will return a 404 by default)
- return a 503 until DB is initialized
- Until receiving first Snapshot message, ApigeeSync-dependent APIs must either:
- Upon receiving a snapshot notification (this is a HOT DB upgrade)
- Get DB for version (use Snapshot.SnapshotInfo as version)
- Create plugin's tables, if needed
- Insert any snapshot data into plugin's tables
- Set reference to new DB for all data access
- If db-dependent services are not exposed yet, expose them
Example plugin code:
var (
log apid.LogService // set in initPlugin
data apid.DataService
unsafeDB apid.DB
dbMux sync.RWMutex
)
func init() {
apid.RegisterPlugin(initPlugin)
}
func initPlugin(services apid.Services) error {
log = services.Log().ForModule("examplePlugin")
log.Debug("start init")
data = services.Data()
return nil
}
// always use getDB() to safely access current DB
func getDB() apid.DB {
dbMux.RLock()
db := unsafeDB
dbMux.RUnlock()
return db
}
func setDB(db apid.DB) {
dbMux.Lock()
if unsafeDB == nil { // init API on DB initialization (optional)
go initAPI()
}
unsafeDB = db
dbMux.Unlock()
}
func processSnapshot(snapshot *common.Snapshot) {
log.Debugf("Snapshot received. Switching to DB version: %s", snapshot.SnapshotInfo)
db, err := data.DBVersion(snapshot.SnapshotInfo)
if err != nil {
log.Panicf("Unable to access database: %v", err)
}
// init DB as needed (note: DB may exist, use 'CREATE TABLE IF NOT EXISTS' if not explicitly checking)
initDB(db)
for _, table := range snapshot.Tables {
// populate tables from snapshot...
}
// switch to new database
setDB(db)
log.Debug("Snapshot processed")
}
Make sure you have transicator in your $GOPATH/src/github.com/apigee-labs/transicator before you run docker tests.
make dockertest
This docker test assumes:
If you're running it on Macbook, your docker host is localhost. If you're running it on Goobuntu, your docker ip is 192.168.9.1 (if you follow go/installdocker).