// Copyright 2017 Google Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package dockertests

import "time"

type apidClusterRow struct {
	id             string
	name           string
	description    string
	appName        string
	created        time.Time
	createdBy      string
	updated        time.Time
	updatedBy      string
	changeSelector string
}

/* FOREIGN KEY (apid_cluster_id)
 * REFERENCES apid_cluster(id) ON DELETE CASCADE
 */
type dataScopeRow struct {
	id             string
	clusterId      string
	scope          string
	org            string
	env            string
	created        time.Time
	createdBy      string
	updated        time.Time
	updatedBy      string
	changeSelector string
	orgScope       string
	envScope       string
}

/* FOREIGN KEY (data_scope_id)
 * REFERENCES data_scope(id) ON DELETE CASCADE
 */
type bundleConfigRow struct {
	id           string
	scopeId      string
	name         string
	uri          string
	checksumType string
	checksum     string
	created      time.Time
	createdBy    string
	updated      time.Time
	updatedBy    string
}

/* FOREIGN KEY (bundle_config_id)
 * REFERENCES bundle_config(id) ON DELETE CASCADE
 */
type deploymentRow struct {
	id               string
	configId         string
	clusterId        string
	scopeId          string
	bundleConfigName string
	bundleConfigJson string
	configJson       string
	created          time.Time
	createdBy        string
	updated          time.Time
	updatedBy        string
	changeSelector   string
}

type bundleConfigData struct {
	Id        string `json:"id"`
	Created   string `json:"created"`
	CreatedBy string `json:"createdBy"`
	Updated   string `json:"updated"`
	UpdatedBy string `json:"updatedBy"`
	Name      string `json:"name"`
	Uri       string `json:"uri"`
}
