in pkg/apisix/cluster.go [116:183]
func newCluster(ctx context.Context, o *ClusterOptions) (Cluster, error) {
if o.BaseURL == "" {
return nil, errors.New("empty base url")
}
if o.Timeout == time.Duration(0) {
o.Timeout = _defaultTimeout
}
if o.SyncInterval.Duration == time.Duration(0) {
o.SyncInterval = types.TimeDuration{Duration: _defaultSyncInterval}
}
o.BaseURL = strings.TrimSuffix(o.BaseURL, "/")
u, err := url.Parse(o.BaseURL)
if err != nil {
return nil, err
}
// if the version is not v3, then fallback to v2
adminVersion := o.AdminAPIVersion
if adminVersion != "v3" {
adminVersion = "v2"
}
c := &cluster{
adminVersion: adminVersion,
name: o.Name,
baseURL: o.BaseURL,
baseURLHost: u.Host,
adminKey: o.AdminKey,
cli: &http.Client{
Timeout: o.Timeout,
Transport: _defaultTransport,
},
cacheState: _cacheSyncing, // default state
cacheSynced: make(chan struct{}),
syncComparison: o.SyncComparison,
metricsCollector: o.MetricsCollector,
}
c.route = newRouteClient(c)
c.upstream = newUpstreamClient(c)
c.ssl = newSSLClient(c)
c.streamRoute = newStreamRouteClient(c)
c.globalRules = newGlobalRuleClient(c)
c.consumer = newConsumerClient(c)
c.plugin = newPluginClient(c)
c.schema = newSchemaClient(c)
c.pluginConfig = newPluginConfigClient(c)
c.upstreamServiceRelation = newUpstreamServiceRelation(c)
c.pluginMetadata = newPluginMetadataClient(c)
c.cache, err = cache.NewMemDBCache()
if err != nil {
return nil, err
}
if o.SyncComparison {
c.generatedObjCache, err = cache.NewMemDBCache()
} else {
c.generatedObjCache, err = cache.NewNoopDBCache()
}
if err != nil {
return nil, err
}
go c.syncCache(ctx)
go c.syncSchema(ctx, o.SyncInterval.Duration)
return c, nil
}