Fix issue with JSON formatting, redo main cmd to simply accept a file containing expected deployments
diff --git a/README.md b/README.md
index aef30fa..c5bf99a 100644
--- a/README.md
+++ b/README.md
@@ -30,10 +30,35 @@
     
 Command line options:
 
-* -bundle <file path> -config <file path>
+* -deployments <file path>
 
-If you use the `-bundle` option, the server will start using a clean database that contains only the
- deployment bundle specified. 
+If you use the `-deployments` option, the server will start using a clean database that contains only the
+ deployments contained in the file specified. 
+ 
+The file should be the JSON for an array of deployments. JSON format is:
+
+        [
+          {
+            "id": "",
+            "scopeId": "",
+            "created": "",
+            "createdBy": "",
+            "updated": "",
+            "updatedBy": "",
+            "configuration": {
+              "key": "value"
+            },
+            "bundleConfiguration": {
+              "key": "value"
+            },
+            "displayName": "",
+            "uri": ""
+          }
+        ]
+ 
+Notes:
+* id must be unique
+* uri should point to a bundle file
  
 Once the process is running, you should be able to manually give the plugin's API a whirl...
 
diff --git a/api.go b/api.go
index fed9e55..8a54a31 100644
--- a/api.go
+++ b/api.go
@@ -28,20 +28,21 @@
 	Reason    string `json:"reason"`
 }
 
-type apiDeployment struct {
-	ID                string `json:"id"`
-	ScopeId           string `json:"scopeId"`
-	Created           string `json:"created"`
-	CreatedBy         string `json:"createdBy"`
-	Updated           string `json:"updated"`
-	UpdatedBy         string `json:"updatedBy"`
-	ConfigurationJson string `json:"configurationJson"`
-	DisplayName       string `json:"displayName"`
-	URI               string `json:"uri"`
+type ApiDeployment struct {
+	ID               string          `json:"id"`
+	ScopeId          string          `json:"scopeId"`
+	Created          string          `json:"created"`
+	CreatedBy        string          `json:"createdBy"`
+	Updated          string          `json:"updated"`
+	UpdatedBy        string          `json:"updatedBy"`
+	ConfigJson       json.RawMessage `json:"configuration"`
+	BundleConfigJson json.RawMessage `json:"bundleConfiguration"`
+	DisplayName      string          `json:"displayName"`
+	URI              string          `json:"uri"`
 }
 
 // sent to client
-type apiDeploymentResponse []apiDeployment
+type ApiDeploymentResponse []ApiDeployment
 
 type apiDeploymentResult struct {
 	ID        string `json:"id"`
@@ -184,17 +185,18 @@
 
 func sendDeployments(w http.ResponseWriter, dataDeps []DataDeployment, eTag string) {
 
-	var apiDeps apiDeploymentResponse
+	var apiDeps ApiDeploymentResponse
 
 	for _, d := range dataDeps {
-		apiDeps = append(apiDeps, apiDeployment{
+		apiDeps = append(apiDeps, ApiDeployment{
 			ID:                d.ID,
 			ScopeId:           d.DataScopeID,
 			Created:           d.Created,
 			CreatedBy:         d.CreatedBy,
 			Updated:           d.Updated,
 			UpdatedBy:         d.UpdatedBy,
-			ConfigurationJson: d.ConfigJSON,
+			BundleConfigJson:  []byte(d.BundleConfigJSON),
+			ConfigJson:        []byte(d.ConfigJSON),
 			DisplayName:       d.BundleName,
 			URI:               d.LocalBundleURI,
 		})
diff --git a/api_test.go b/api_test.go
index be29bd1..cb8ec38 100644
--- a/api_test.go
+++ b/api_test.go
@@ -44,7 +44,7 @@
 			Expect(err).ShouldNot(HaveOccurred())
 			defer res.Body.Close()
 
-			var depRes apiDeploymentResponse
+			var depRes ApiDeploymentResponse
 			body, err := ioutil.ReadAll(res.Body)
 			Expect(err).ShouldNot(HaveOccurred())
 			json.Unmarshal(body, &depRes)
@@ -57,8 +57,15 @@
 			Expect(dep.ScopeId).To(Equal(deploymentID))
 			Expect(dep.DisplayName).To(Equal(deploymentID))
 
-			// todo: more tests
-			//dep.ConfigurationJson
+			var config bundleConfigJson
+
+			err = json.Unmarshal(dep.ConfigJson, &config)
+			Expect(err).ShouldNot(HaveOccurred())
+			Expect(config.Name).To(Equal("/bundles/1"))
+
+			err = json.Unmarshal(dep.BundleConfigJson, &config)
+			Expect(err).ShouldNot(HaveOccurred())
+			Expect(config.Name).To(Equal("/bundles/1"))
 		})
 
 		It("should get 304 for no change", func() {
@@ -124,7 +131,7 @@
 				defer res.Body.Close()
 				Expect(res.StatusCode).To(Equal(http.StatusOK))
 
-				var depRes apiDeploymentResponse
+				var depRes ApiDeploymentResponse
 				body, err := ioutil.ReadAll(res.Body)
 				Expect(err).ShouldNot(HaveOccurred())
 				json.Unmarshal(body, &depRes)
@@ -315,7 +322,7 @@
 		ApidClusterID: deploymentID,
 		DataScopeID: deploymentID,
 		BundleConfigJSON: string(bundleJson),
-		ConfigJSON: "",
+		ConfigJSON: string(bundleJson),
 		Status: "",
 		Created: "",
 		CreatedBy: "",
diff --git a/cmd/apidGatewayDeploy/deployments.json b/cmd/apidGatewayDeploy/deployments.json
new file mode 100644
index 0000000..72efd9f
--- /dev/null
+++ b/cmd/apidGatewayDeploy/deployments.json
@@ -0,0 +1,24 @@
+[
+  {
+    "id": "api_no_change_blocking",
+    "scopeId": "api_no_change_blocking",
+    "created": "",
+    "createdBy": "",
+    "updated": "",
+    "updatedBy": "",
+    "configuration": {
+      "name": "/bundles/1",
+      "uri": "http://127.0.0.1:53589/bundles/1",
+      "checksumType": "crc-32",
+      "checksum": "c65a0f2a"
+    },
+    "bundleConfiguration": {
+      "name": "/bundles/1",
+      "uri": "http://127.0.0.1:53589/bundles/1",
+      "checksumType": "crc-32",
+      "checksum": "c65a0f2a"
+    },
+    "displayName": "api_no_change_blocking",
+    "uri": "x"
+  }
+]
\ No newline at end of file
diff --git a/cmd/apidGatewayDeploy/main.go b/cmd/apidGatewayDeploy/main.go
index 32de317..63961f5 100644
--- a/cmd/apidGatewayDeploy/main.go
+++ b/cmd/apidGatewayDeploy/main.go
@@ -2,24 +2,19 @@
 
 import (
 	"flag"
-	"io/ioutil"
-	"os"
-	"strings"
-
-	"fmt"
-
 	"github.com/30x/apid"
 	"github.com/30x/apid/factory"
-	"github.com/30x/apidGatewayDeploy"
 	_ "github.com/30x/apidGatewayDeploy"
+	"io/ioutil"
+	"github.com/30x/apidGatewayDeploy"
+	"os"
+	"encoding/json"
 )
 
 func main() {
-	bundleFlag := flag.String("bundle", "", "file path to a bundle file (for testing)")
-	configFlag := flag.String("config", "", "file path to a bundle config file (for testing)")
+	deploymentsFlag := flag.String("deployments", "", "file path to a deployments file (for testing)")
 	flag.Parse()
-	bundleFile := *bundleFlag
-	configFile := *configFlag
+	deploymentsFile := *deploymentsFlag
 
 	apid.Initialize(factory.DefaultServicesFactory())
 
@@ -28,10 +23,9 @@
 
 	configService := apid.Config()
 
-	// if bundle is specified, start in a temp dir for testing
-	var bundleConfig string
-	if bundleFile != "" {
-		log.Printf("Running in temp dir with bundle file: %s", bundleFile)
+	var deployments apiGatewayDeploy.ApiDeploymentResponse
+	if deploymentsFile != "" {
+		log.Printf("Running in temp dir using deployments file: %s", deploymentsFile)
 		tmpDir, err := ioutil.TempDir("", "apidGatewayDeploy")
 		if err != nil {
 			log.Panicf("ERROR: Unable to create temp dir", err)
@@ -39,37 +33,27 @@
 		defer os.RemoveAll(tmpDir)
 
 		configService.Set("data_path", tmpDir)
-		configService.Set("gatewaydeploy_bundle_dir", tmpDir)
+		configService.Set("gatewaydeploy_bundle_dir", tmpDir) // todo: legacy?
 
-		if configFile != "" {
-			bundleConfigBytes, err := ioutil.ReadFile(configFile)
+		if deploymentsFile != "" {
+			bytes, err := ioutil.ReadFile(deploymentsFile)
 			if err != nil {
-				log.Errorf("ERROR: Unable to read bundle config file at %s", configFile)
+				log.Errorf("ERROR: Unable to read bundle config file at %s", deploymentsFile)
 				return
 
 			}
-			bundleConfig = string(bundleConfigBytes)
+
+			err = json.Unmarshal(bytes, &deployments)
+			if err != nil {
+				log.Errorf("ERROR: Unable to parse deployments %v", err)
+				return
+			}
 		}
 	}
 
 	apid.InitializePlugins()
 
-	if bundleFile != "" {
-		if strings.ContainsAny(bundleFile, ",") {
-			for deploymentCount, singleBundleFile := range strings.Split(bundleFile, ",") {
-				deployment := fmt.Sprintf("testDeployment-%d", deploymentCount)
-				err := insertTestDeployment(singleBundleFile, bundleConfig, deployment)
-				if err != nil {
-					log.Fatal(err)
-				}
-			}
-		} else {
-			err := insertTestDeployment(bundleFile, bundleConfig, "testDeployment")
-			if err != nil {
-				log.Fatal(err)
-			}
-		}
-	}
+	insertTestDeployments(deployments)
 
 	// print the base url to the console
 	basePath := "/deployments"
@@ -84,25 +68,10 @@
 	log.Fatalf("Error. Is something already running on port %d? %s", port, err)
 }
 
-func insertTestDeployment(bundleFile, bundleConfig string, deploymentID string) error {
+func insertTestDeployments(deployments apiGatewayDeploy.ApiDeploymentResponse) error {
 
-	dep := apiGatewayDeploy.DataDeployment{
-		ID:                 deploymentID,
-		BundleConfigID:     deploymentID,
-		ApidClusterID:      deploymentID,
-		DataScopeID:        deploymentID,
-		BundleConfigJSON:   bundleConfig,
-		ConfigJSON:         "",
-		Status:             "",
-		Created:            "",
-		CreatedBy:          "",
-		Updated:            "",
-		UpdatedBy:          "",
-		BundleName:         deploymentID,
-		BundleURI:          bundleFile,
-		BundleChecksum:     "",
-		BundleChecksumType: "",
-		LocalBundleURI:     bundleFile,
+	if len(deployments) == 0 {
+		return nil
 	}
 
 	log := apid.Log()
@@ -123,10 +92,34 @@
 		return err
 	}
 
-	err = apiGatewayDeploy.InsertDeployment(tx, dep)
-	if err != nil {
-		log.Error("Unable to insert deployment")
-		return err
+	for _, ad := range deployments {
+
+		dep := apiGatewayDeploy.DataDeployment{
+			ID:                 ad.ID,
+			BundleConfigID:     ad.ID,
+			ApidClusterID:      ad.ID,
+			DataScopeID:        ad.ScopeId,
+			BundleConfigJSON:   string(ad.BundleConfigJson),
+			ConfigJSON:         string(ad.ConfigJson),
+			Status:             "",
+			Created:            "",
+			CreatedBy:          "",
+			Updated:            "",
+			UpdatedBy:          "",
+			BundleName:         deploymentID,
+			BundleURI:          bundleFile,
+			BundleChecksum:     "",
+			BundleChecksumType: "",
+			LocalBundleURI:     bundleFile,
+		}
+
+
+		err = apiGatewayDeploy.InsertDeployment(tx, dep)
+		if err != nil {
+			log.Error("Unable to insert deployment")
+			return err
+		}
+
 	}
 
 	err = tx.Commit()
@@ -137,4 +130,4 @@
 	apiGatewayDeploy.InitAPI()
 
 	return nil
-}
+}
\ No newline at end of file
diff --git a/data.go b/data.go
index d21070a..45ad641 100644
--- a/data.go
+++ b/data.go
@@ -2,9 +2,9 @@
 
 import (
 	"database/sql"
+	"fmt"
 	"github.com/30x/apid"
 	"sync"
-	"fmt"
 )
 
 var (
@@ -13,22 +13,22 @@
 )
 
 type DataDeployment struct {
-	ID                string
-	BundleConfigID    string
-	ApidClusterID     string
-	DataScopeID       string
-	BundleConfigJSON  string
-	ConfigJSON  	  string
-	Status		  string
-	Created		  string
-	CreatedBy         string
-	Updated           string
-	UpdatedBy         string
-	BundleName	  string
-	BundleURI	  string
-	BundleChecksum	  string
+	ID                 string
+	BundleConfigID     string
+	ApidClusterID      string
+	DataScopeID        string
+	BundleConfigJSON   string
+	ConfigJSON         string
+	Status             string
+	Created            string
+	CreatedBy          string
+	Updated            string
+	UpdatedBy          string
+	BundleName         string
+	BundleURI          string
+	BundleChecksum     string
 	BundleChecksumType string
-	LocalBundleURI    string
+	LocalBundleURI     string
 }
 
 type SQLExec interface {
@@ -171,7 +171,7 @@
 		return err
 	}
 
-	deploymentsChanged<- depID
+	deploymentsChanged <- depID
 
 	log.Debugf("deleteDeployment %s succeeded", depID)
 	return err
@@ -190,7 +190,7 @@
 	WHERE local_bundle_uri != ""
 	`)
 	if err != nil {
-		if err == sql.ErrNoRows{
+		if err == sql.ErrNoRows {
 			return deployments, nil
 		}
 		log.Errorf("Error querying deployments: %v", err)