blob: f507357216356caee47dc278df9f8bf704a4e69a [file] [log] [blame]
package apiGatewayDeploy
import (
"fmt"
"net/url"
"os"
"path"
"time"
"github.com/30x/apid-core"
)
const (
configBundleDirKey = "gatewaydeploy_bundle_dir"
configDebounceDuration = "gatewaydeploy_debounce_duration"
configBundleCleanupDelay = "gatewaydeploy_bundle_cleanup_delay"
configBundleDownloadTimeout = "gatewaydeploy_bundle_download_timeout"
configApiServerBaseURI = "apigeesync_proxy_server_base"
configApidInstanceID = "apigeesync_apid_instance_id"
configApidClusterID = "apigeesync_cluster_id"
configConcurrentDownloads = "apigeesync_concurrent_downloads"
configDownloadQueueSize = "apigeesync_download_queue_size"
)
var (
services apid.Services
log apid.LogService
data apid.DataService
bundlePath string
debounceDuration time.Duration
bundleCleanupDelay time.Duration
apiServerBaseURI *url.URL
apidInstanceID string
apidClusterID string
downloadQueueSize int
concurrentDownloads int
)
func init() {
apid.RegisterPlugin(initPlugin)
}
func initPlugin(s apid.Services) (apid.PluginData, error) {
services = s
log = services.Log().ForModule("apiGatewayDeploy")
log.Debug("start init")
config := services.Config()
if !config.IsSet(configApiServerBaseURI) {
return pluginData, fmt.Errorf("Missing required config value: %s", configApiServerBaseURI)
}
var err error
apiServerBaseURI, err = url.Parse(config.GetString(configApiServerBaseURI))
if err != nil {
return pluginData, fmt.Errorf("%s value %s parse err: %v", configApiServerBaseURI, apiServerBaseURI, err)
}
if !config.IsSet(configApidInstanceID) {
return pluginData, fmt.Errorf("Missing required config value: %s", configApidInstanceID)
}
apidInstanceID = config.GetString(configApidInstanceID)
if !config.IsSet(configApidClusterID) {
return pluginData, fmt.Errorf("Missing required config value: %s", configApidClusterID)
}
apidClusterID = config.GetString(configApidClusterID)
config.SetDefault(configBundleDirKey, "bundles")
config.SetDefault(configDebounceDuration, time.Second)
config.SetDefault(configBundleCleanupDelay, time.Minute)
config.SetDefault(configBundleDownloadTimeout, 5*time.Minute)
config.SetDefault(configConcurrentDownloads, 15)
config.SetDefault(configDownloadQueueSize, 2000)
debounceDuration = config.GetDuration(configDebounceDuration)
if debounceDuration < time.Millisecond {
return pluginData, fmt.Errorf("%s must be a positive duration", configDebounceDuration)
}
bundleCleanupDelay = config.GetDuration(configBundleCleanupDelay)
if bundleCleanupDelay < time.Millisecond {
return pluginData, fmt.Errorf("%s must be a positive duration", configBundleCleanupDelay)
}
bundleDownloadTimeout = config.GetDuration(configBundleDownloadTimeout)
if bundleDownloadTimeout < time.Millisecond {
return pluginData, fmt.Errorf("%s must be a positive duration", configBundleDownloadTimeout)
}
data = services.Data()
concurrentDownloads = config.GetInt(configConcurrentDownloads)
downloadQueueSize = config.GetInt(configDownloadQueueSize)
relativeBundlePath := config.GetString(configBundleDirKey)
storagePath := config.GetString("local_storage_path")
bundlePath = path.Join(storagePath, relativeBundlePath)
if err := os.MkdirAll(bundlePath, 0700); err != nil {
return pluginData, fmt.Errorf("Failed bundle directory creation: %v", err)
}
log.Infof("Bundle directory path is %s", bundlePath)
initializeBundleDownloading()
go distributeEvents()
initListener(services)
log.Debug("end init")
return pluginData, nil
}