add docker setup for generic replication IT
diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..5b6fba0 --- /dev/null +++ b/Makefile
@@ -0,0 +1,8 @@ +test: + go test + +cover: + ./cover.sh + +dockertest: + ./dockertests/dockerTest.sh
diff --git a/dockertests/create-db.sql b/dockertests/create-db.sql new file mode 100644 index 0000000..a1f46db --- /dev/null +++ b/dockertests/create-db.sql
@@ -0,0 +1,12 @@ +-- noinspection SqlDialectInspectionForFile +-- noinspection SqlNoDataSourceInspectionForFile +SET statement_timeout = 0; +SET lock_timeout = 0; +SET client_encoding = 'UTF8'; +SET standard_conforming_strings = on; +SET check_function_bodies = false; +SET client_min_messages = warning; +SET row_security = off; + +CREATE DATABASE edgex WITH TEMPLATE = template0 ENCODING = 'UTF8'; +ALTER DATABASE edgex OWNER TO postgres;
diff --git a/dockertests/dockerCleanup.sh b/dockertests/dockerCleanup.sh new file mode 100755 index 0000000..6a9437f --- /dev/null +++ b/dockertests/dockerCleanup.sh
@@ -0,0 +1,5 @@ +pgname=apidSync_test_pg +ssname=apidSync_test_ss +csname=apidSync_test_cs +docker kill ${pgname} ${csname} ${ssname} +docker rm -f ${pgname} ${csname} ${ssname} \ No newline at end of file
diff --git a/dockertests/dockerTest.sh b/dockertests/dockerTest.sh new file mode 100755 index 0000000..5c5a0cd --- /dev/null +++ b/dockertests/dockerTest.sh
@@ -0,0 +1,56 @@ +#!/usr/bin/env bash + +WORK_DIR=$(pwd) +TRANSICATOR_DIR="$GOPATH/src/github.com/apigee-labs/transicator" +DOCKER_IP="192.168.9.1" +if [ "$(uname)" == Darwin ]; +then + DOCKER_IP="localhost" +fi +TEST_PG_BASE=postgres://postgres:changeme@$DOCKER_IP:5432 +TEST_PG_URL=postgres://postgres:changeme@$DOCKER_IP:5432/edgex +echo ${TEST_PG_URL} + +export APIGEE_SYNC_DOCKER_IP=${DOCKER_IP} + +pgnum=$(docker images --filter "reference=apigeelabs/transicator-postgres" | wc -l) +ssnum=$(docker images --filter "reference=apigeelabs/transicator-snapshot" | wc -l) +csnum=$(docker images --filter "reference=apigeelabs/transicator-changeserver" | wc -l) + + +if (( !(pgnum>1 && ssnum>1 && csnum>1) )) +then + cd ${TRANSICATOR_DIR} + make + make docker + cd ${WORK_DIR} +fi + +echo "Starting Transicator docker" +pgname=apidSync_test_pg +ssname=apidSync_test_ss +csname=apidSync_test_cs + +# run PG +docker run --name ${pgname} -p 5432:5432 -d -e POSTGRES_PASSWORD=changeme apigeelabs/transicator-postgres + +# Wait for PG to be up -- it takes a few seconds +while `true` +do + sleep 1 + psql -q -c 'select * from now()' ${TEST_PG_BASE} + if [ $? -eq 0 ] + then + break + fi +done + +# init pg +psql -f ${WORK_DIR}/dockertests/create-db.sql ${TEST_PG_BASE} +psql -f ${WORK_DIR}/dockertests/master-schema.sql ${TEST_PG_URL} +psql -f ${WORK_DIR}/dockertests/user-setup.sql ${TEST_PG_URL} + +# run SS and CS +docker run --name ${ssname} -d -p 9001:9001 apigeelabs/transicator-snapshot -p 9001 -u ${TEST_PG_URL} +docker run --name ${csname} -d -p 9000:9000 apigeelabs/transicator-changeserver -p 9000 -u ${TEST_PG_URL} -s testslot +
diff --git a/dockertests/docker_test.go b/dockertests/docker_test.go new file mode 100644 index 0000000..72589e2 --- /dev/null +++ b/dockertests/docker_test.go
@@ -0,0 +1,128 @@ +package dockertests + +import ( + "github.com/30x/apidApigeeSync" + "github.com/30x/apid-core" + "github.com/apigee-labs/transicator/common" + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" + "net/http" + "net/http/httptest" + "os" + "github.com/30x/apid-core/factory" + "github.com/Sirupsen/logrus" +) + +const ( + dockerCsPort string = "9000" + dockerSsPort string = "9001" + dockerPgPort string = "5432" + pluginName = "apigeeSyncDockerTest" + configLogLevel = "log_level" + configProxyServerBaseURI = "apigeesync_proxy_server_base" + configSnapServerBaseURI = "apigeesync_snapshot_server_base" + configChangeServerBaseURI = "apigeesync_change_server_base" + configConsumerKey = "apigeesync_consumer_key" + configConsumerSecret = "apigeesync_consumer_secret" + configApidClusterId = "apigeesync_cluster_id" + configSnapshotProtocol = "apigeesync_snapshot_proto" + configName = "apigeesync_instance_name" + ApigeeSyncEventSelector = "ApigeeSync" + + // special value - set by ApigeeSync, not taken from configuration + configApidInstanceID = "apigeesync_apid_instance_id" + // This will not be needed once we have plugin handling tokens. + configBearerToken = "apigeesync_bearer_token" +) + + +var ( + services apid.Services + log apid.LogService + data apid.DataService + config apid.ConfigService +) +/* + * This test suite acts like a dummy plugin. It listens to events emitted by + * apidApigeeSync and runs tests. + */ + +var _ = Describe("dockerIT", func() { + + + + BeforeSuite(func() { + hostname := os.Getenv("APIGEE_SYNC_DOCKER_IP") + + apid.Initialize(factory.DefaultServicesFactory()) + config = apid.Config() + + // Set log level + config.Set(configLogLevel, logrus.DebugLevel.String()) + + // Auth Server + config.Set(configName, "dockerIT") + config.Set(configConsumerKey, "dummyKey") + config.Set(configConsumerSecret, "dummySecret") + config.Set(configApidClusterId, "testClusterId") + testServer := initDummyAuthServer() + + // Setup dependencies + config.Set(configChangeServerBaseURI, hostname+":"+dockerCsPort) + config.Set(configSnapServerBaseURI, hostname+":"+dockerSsPort) + config.Set(configProxyServerBaseURI, testServer.URL) + + // init plugin + apid.RegisterPlugin(initPlugin) + apid.InitializePlugins("dockerTest") + }) + + + + Context("Generic Replication", func() { + var _ = BeforeEach(func() { + + }) + + It("should succesfully download table from pg", func() { + log.Debug("CS: " + config.GetString(configChangeServerBaseURI)) + log.Debug("SS: " + config.GetString(configSnapServerBaseURI)) + log.Debug("Auth: " + config.GetString(configProxyServerBaseURI)) + }) + }) +}) + +func initDummyAuthServer() (testServer *httptest.Server) { + testRouter := apid.API().Router() + testServer = httptest.NewServer(testRouter) + // set up mock server + mockParms := apidApigeeSync.MockParms{ + ReliableAPI: true, + ClusterID: config.GetString(configApidClusterId), + TokenKey: config.GetString(configConsumerKey), + TokenSecret: config.GetString(configConsumerSecret), + Scope: "dockerTest", + Organization: "dockerTest", + Environment: "prod", + } + apidApigeeSync.Mock(mockParms, testRouter) + return +} + +func initPlugin(s apid.Services) (apid.PluginData, error) { + services = s + log = services.Log().ForModule(pluginName) + data = services.Data() + + var pluginData = apid.PluginData { + Name: pluginName, + Version: "0.0.1", + ExtraData: map[string]interface{}{ + "schemaVersion": "0.0.1", + }, + } + + + log.Info(pluginName + " initialized.") + return pluginData, nil +} \ No newline at end of file
diff --git a/dockertests/master-schema.sql b/dockertests/master-schema.sql new file mode 100644 index 0000000..b53c815 --- /dev/null +++ b/dockertests/master-schema.sql
@@ -0,0 +1,116 @@ +CREATE SCHEMA IF NOT EXISTS edgex; +ALTER DATABASE edgex SET search_path TO edgex; +SET search_path TO edgex; + +CREATE TABLE apid_cluster ( + id character varying(36) NOT NULL, + name text NOT NULL, + description text, + umbrella_org_app_name text NOT NULL, + created timestamp without time zone, + created_by text, + updated timestamp without time zone, + updated_by text, + _change_selector text, + CONSTRAINT apid_cluster_pkey PRIMARY KEY (id) +); + +CREATE INDEX apid_cluster___change_selector_idx ON apid_cluster USING btree (_change_selector); +CREATE INDEX apid_cluster_created_by_idx ON apid_cluster USING btree (created_by); + +CREATE TABLE data_scope ( + id character varying(36) NOT NULL, + apid_cluster_id character varying(36) NOT NULL, + scope text NOT NULL, + org text, + env text, + created timestamp without time zone, + created_by text, + updated timestamp without time zone, + updated_by text, + _change_selector text, + CONSTRAINT data_scope_pkey PRIMARY KEY (id), + CONSTRAINT data_scope_apid_cluster_id_fk FOREIGN KEY (apid_cluster_id) + REFERENCES apid_cluster (id) + ON UPDATE NO ACTION ON DELETE CASCADE +); +CREATE INDEX apid_cluster_scope__change_selector_idx ON data_scope USING btree (_change_selector); +CREATE INDEX apid_cluster_scope_apid_cluster_id_idx ON data_scope USING btree (apid_cluster_id); +CREATE UNIQUE INDEX apid_cluster_scope_apid_cluster_id_org_env_idx ON data_scope USING btree (apid_cluster_id, org, env); +CREATE INDEX data_scope_created_by_idx ON apid_cluster USING btree (created_by); + + +CREATE TABLE bundle_config ( + id character varying(36) NOT NULL, + data_scope_id character varying(36) NOT NULL, + name text NOT NULL, + uri text NOT NULL, + checksumType text, + checksum text, + created timestamp without time zone, + created_by text, + updated timestamp without time zone, + updated_by text, + CONSTRAINT bundle_config_pkey PRIMARY KEY (id), + CONSTRAINT bundle_config_data_scope_id_fk FOREIGN KEY (data_scope_id) + REFERENCES data_scope (id) + ON UPDATE NO ACTION ON DELETE CASCADE +); + +CREATE INDEX bundle_config_data_scope_id_idx ON bundle_config USING btree (data_scope_id); +CREATE INDEX bundle_config_created_by_idx ON apid_cluster USING btree (created_by); + +CREATE TABLE deployment ( + id character varying(36) NOT NULL, + bundle_config_id character varying(36) NOT NULL, + apid_cluster_id character varying(36) NOT NULL, + data_scope_id character varying(36) NOT NULL, + bundle_config_name text NOT NULL, + bundle_config_json text NOT NULL, + config_json text NOT NULL, + created timestamp without time zone, + created_by text, + updated timestamp without time zone, + updated_by text, + _change_selector text, + CONSTRAINT deployment_pkey PRIMARY KEY (id), + CONSTRAINT deployment_bundle_config_id_fk FOREIGN KEY (bundle_config_id) + REFERENCES bundle_config (id) + ON UPDATE NO ACTION ON DELETE CASCADE +); + +CREATE TABLE deployment_history ( + id character varying(36) NOT NULL, + deployment_id character varying(36) NOT NULL, + action text NOT NULL, + bundle_config_id character varying(36), + apid_cluster_id character varying(36) NOT NULL, + data_scope_id character varying(36) NOT NULL, + bundle_config_json text NOT NULL, + config_json text NOT NULL, + created timestamp without time zone, + created_by text, + updated timestamp without time zone, + updated_by text, + CONSTRAINT deployment_history_pkey PRIMARY KEY (id) +); + +CREATE INDEX deployment__change_selector_idx ON deployment USING btree (_change_selector); +CREATE INDEX deployment_apid_cluster_id_idx ON deployment USING btree (apid_cluster_id); +CREATE INDEX deployment_bundle_config_id_idx ON deployment USING btree (bundle_config_id); +CREATE INDEX deployment_data_scope_id_idx ON deployment USING btree (data_scope_id); +CREATE INDEX deployment_created_by_idx ON apid_cluster USING btree (created_by); + +CREATE TABLE configuration ( + id character varying(36) NOT NULL, + body text NOT NULL DEFAULT '{}', + created timestamp without time zone, + created_by text, + updated timestamp without time zone, + updated_by text, + CONSTRAINT configuration_pkey PRIMARY KEY (id) +); + +ALTER TABLE apid_cluster REPLICA IDENTITY FULL; +ALTER TABLE data_scope REPLICA IDENTITY FULL; +ALTER TABLE deployment REPLICA IDENTITY FULL; \ No newline at end of file
diff --git a/dockertests/user-setup.sql b/dockertests/user-setup.sql new file mode 100644 index 0000000..8068c40 --- /dev/null +++ b/dockertests/user-setup.sql
@@ -0,0 +1 @@ +ALTER USER postgres SET search_path = edgex; \ No newline at end of file