config

package
v2.11.26 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 3, 2024 License: Apache-2.0 Imports: 11 Imported by: 0

Documentation

Overview

Package config holds the typed objects that define the schemas for assorted ConfigMap objects on which Kf depends

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

https://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.

Index

Examples

Constants

View Source
const (
	// DefaultsConfigName is the name of the defaults configmap.
	DefaultsConfigName = "config-defaults"
)

Variables

This section is empty.

Functions

func DefaultConfigContext

func DefaultConfigContext(ctx context.Context) context.Context

DefaultConfigContext attaches a Config with all default values to the context.

func IsYAMLEqual

func IsYAMLEqual(expected, actual string) (bool, error)

IsYAMLEqual returns whether the expexted YAML matches the actual YAML.

Example
spaceStacksOrigYAML := `- name: aaa
  image: aaa/image
  description: aaa stack
- name: bbb
  image: bbb/image
  description: bbb stack
`
spaceStacksAlphabetizedYAML := `- description: aaa stack
  image: aaa/image
  name: aaa
- description: bbb stack
  image: bbb/image
  name: bbb
`

fmt.Println("Orig SpaceStacksV2 YAML:")
fmt.Println(spaceStacksOrigYAML)
fmt.Println("Reformatted (alphabetized) SpaceStacksV2 YAML:")
fmt.Println(spaceStacksAlphabetizedYAML)
equalYAML, err := IsYAMLEqual(spaceStacksOrigYAML, spaceStacksAlphabetizedYAML)
fmt.Println("IsYAMLEqual:", equalYAML)
fmt.Println("Error:", err)
Output:

Orig SpaceStacksV2 YAML:
- name: aaa
  image: aaa/image
  description: aaa stack
- name: bbb
  image: bbb/image
  description: bbb stack

Reformatted (alphabetized) SpaceStacksV2 YAML:
- description: aaa stack
  image: aaa/image
  name: aaa
- description: bbb stack
  image: bbb/image
  name: bbb

IsYAMLEqual: true
Error: <nil>

func ToContextForTest

func ToContextForTest(ctx context.Context, c *Config) context.Context

ToContextForTest adds Config type values to the context. This should be used for tests only.

Types

type BuildNodeSelectors

type BuildNodeSelectors map[string]string

BuildNodeSelectors maps node selector keys with node selector values.

func (BuildNodeSelectors) DeepCopy

func (in BuildNodeSelectors) DeepCopy() BuildNodeSelectors

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BuildNodeSelectors.

func (BuildNodeSelectors) DeepCopyInto

func (in BuildNodeSelectors) DeepCopyInto(out *BuildNodeSelectors)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type BuildpackV2Definition

type BuildpackV2Definition struct {
	// Name is the human readable name of the buildpack.
	Name string `json:"name"`
	// URL is the URL of the given buildpack.
	URL string `json:"url"`
	// Disabled is set when this buildpack shouldn't be used to
	// build apps.
	Disabled bool `json:"disabled"`
}

BuildpackV2Definition contains the a definition of a buildpack.

func (*BuildpackV2Definition) DeepCopy

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BuildpackV2Definition.

func (*BuildpackV2Definition) DeepCopyInto

func (in *BuildpackV2Definition) DeepCopyInto(out *BuildpackV2Definition)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

func (*BuildpackV2Definition) Validate

func (defn *BuildpackV2Definition) Validate(ctx context.Context) (err *apis.FieldError)

Validate implements apis.Validatable

type BuildpackV2List

type BuildpackV2List []BuildpackV2Definition

BuildpackV2List holds an array of BuildpackV2Definition. Its primary use is doing validation over a list of Buildpacks.

func (BuildpackV2List) DeepCopy

func (in BuildpackV2List) DeepCopy() BuildpackV2List

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BuildpackV2List.

func (BuildpackV2List) DeepCopyInto

func (in BuildpackV2List) DeepCopyInto(out *BuildpackV2List)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

func (BuildpackV2List) MapToURL

func (list BuildpackV2List) MapToURL(name string) string

MapToURL looks up the buildpack in the given list and returns the URL of the corresponding buildpack. If the name isn't found, it's returned directly presuming it's either built-in or a URL already.

Example
list := BuildpackV2List{
	{
		Name: "java_buildpack",
		URL:  "https://path-to-java-buildpack",
	},
}

fmt.Println("custom not mapped:", list.MapToURL("https://some-custom-buildpack"))
fmt.Println("java_buildpack:", list.MapToURL("java_buildpack"))
Output:

custom not mapped: https://some-custom-buildpack
java_buildpack: https://path-to-java-buildpack

func (BuildpackV2List) Validate

func (list BuildpackV2List) Validate(ctx context.Context) (err *apis.FieldError)

Validate implements apis.Validatable

func (BuildpackV2List) WithoutDisabled

func (list BuildpackV2List) WithoutDisabled() BuildpackV2List

WithoutDisabled returns a list of buildpacks with the disabled ones filtered out.

Example
list := BuildpackV2List{
	{
		Name:     "java_buildpack",
		Disabled: true,
	},
	{
		Name:     "dotnet_buildpack",
		Disabled: false,
	},
	{
		Name:     "ruby_buildpack",
		Disabled: false,
	},
}

for _, b := range list.WithoutDisabled() {
	fmt.Println(b.Name)
}
Output:

dotnet_buildpack
ruby_buildpack

type Config

type Config struct {
	// contains filtered or unexported fields
}

Config of Kf +k8s:deepcopy-gen=false

func CreateConfigForTest

func CreateConfigForTest(defaults *DefaultsConfig) *Config

CreateConfigForTest creates a *Config with a custom *DefaultsConfig. This should be used for tests only.

func FromContext

func FromContext(ctx context.Context) *Config

FromContext gets the *Config from the context.

func (*Config) Defaults

func (c *Config) Defaults() (*DefaultsConfig, error)

Defaults returns the DefaultsConfig and an error if there was an issue loading the config.

type DefaultsConfig

type DefaultsConfig struct {

	// SpaceContainerRegistry is the default container registry to assign
	// to spaces.
	SpaceContainerRegistry string `json:"spaceContainerRegistry,omitempty"`

	// SpaceClusterDomains is the default domain for spaces. Apps in the
	// space will get the name <app>.<space>.<defaultClusterDomain> by default.
	SpaceClusterDomains []DomainTemplate `json:"spaceClusterDomains,omitempty"`

	// SpaceBuildpacksV2 contains a sorted list of buildpacks to be used for CF
	// compatible builds.
	SpaceBuildpacksV2 BuildpackV2List `json:"spaceBuildpacksV2,omitempty"`

	// SpaceStacksV2 contains a list of stacks that can be used for CF compatible
	// builds.
	SpaceStacksV2 StackV2List `json:"spaceStacksV2,omitempty"`

	// SpaceStacksV3 contains a list of stacks that can be used for CF compatible
	// builds.
	SpaceStacksV3 StackV3List `json:"spaceStacksV3,omitempty"`

	// SpaceDefaultToV3Stack determines whether v3 stacks should be used by
	// default over v2 stacks.
	SpaceDefaultToV3Stack bool `json:"spaceDefaultToV3Stack,omitempty"`

	// RouteServiceProxyImage is the image URL for the Kf route service proxy deployment.
	RouteServiceProxyImage string `json:"routeServiceProxyImage,omitempty"`

	BuildKanikoExecutorImage string `json:"buildKanikoExecutorImage,omitempty"`
	BuildInfoImage           string `json:"buildInfoImage,omitempty"`
	BuildTokenDownloadImage  string `json:"buildTokenDownloadImage,omitempty"`
	BuildHelpersImage        string `json:"buildHelpersImage,omitempty"`
	NopImage                 string `json:"nopImage,omitempty"`

	// BuildpacksV2LifecycleImage is the image URL for the V2 buildpack
	// lifecycle binaries. It is expected to contain the `launcher` and
	// `builder` binaries AND to self extract those binaries into /workspace.
	BuildpacksV2LifecycleImage string `json:"buildpacksV2LifecycleImage,omitempty"`

	// BuildDisableIstioSidecar when set to true, will prevent the Istio
	// sidecar from being attached to the Build pods.
	BuildDisableIstioSidecar bool `json:"buildDisableIstioSidecar,omitempty"`

	// BuildPodResources sets the Build pod resources field.
	// NOTE: This is only applicable for built-in Tasks. For V2 builds, this
	// will be set on two steps and one for V3 and Dockerfiles. This implies
	// for a V2 build, the required Pod size will be the limit doubled.  For
	// example, if the memory limit is 1Gi, then the pod will require 2Gi.
	BuildPodResources *corev1.ResourceRequirements `json:"buildPodResources,omitempty"`

	// BuildRetentionCount is the number of completed Builds each App will
	// keep before garbage collecting.
	BuildRetentionCount *uint `json:"buildRetentionCount,omitempty"`

	// BuildKanikoRobustSnapshotKey turns off fast snapshotting in Kaniko for v2 buildpacks.
	// This causes significantly higher disk usage, but reduces the risk
	// of producing incorrect images. Kf apps shoudln't typically need this on.
	BuildKanikoRobustSnapshot bool `json:"buildKanikoRobustSnapshot,omitempty"`

	// TaskRetentionCount is the number of completed Tasks each App will
	// keep before garbage collecting.
	TaskRetentionCount *uint `json:"taskRetentionCount,omitempty"`

	// BuildTimeout is the timeout value to set at the underlying TaskRun of Build, it is the time duration
	// to fail a build that takes too long to complete, valid values are specified in time unit, e.g. "1h", "30m", "60s"
	BuildTimeout string `json:"buildTimeout,omitempty"`

	// BuildNodeSelectors is the node selectors for the build node pool.
	// When it's specified, the Kf build pods are only assigned to the nodes that have labels matching the selectors.
	BuildNodeSelectors BuildNodeSelectors `json:"buildNodeSelectors,omitempty"`

	// FeatureFlags is a map of feature names to their status (enabled/disabled) represented as a bool.
	FeatureFlags FeatureFlagToggles `json:"featureFlags,omitempty"`

	// Default amount of CPU to assign an app per GB of RAM.
	AppCPUPerGBOfRAM *resource.Quantity `json:"appCPUPerGBOfRAM,omitempty"`

	// Minimum amount of CPU to assign an app.
	AppCPUMin *resource.Quantity `json:"appCPUMin,omitempty"`

	// AppDisableStartCommandLookup disables the App reconciler from looking
	// up the start command for Apps which requires fetching the container
	// configuration for every App.
	AppDisableStartCommandLookup bool `json:"appDisableStartCommandLookup,omitempty"`

	// AppEnableServiceAccountOverride allows apps to override the service account via annotation:
	// apps.kf.dev/service-account-name.
	AppEnableServiceAccountOverride bool `json:"appEnableServiceAccountOverride,omitempty"`

	// ProgressDeadlineSeconds contains the maximum time in seconds for a deployment to make progress before it
	// is considered to be failed.
	ProgressDeadlineSeconds *int32 `json:"progressDeadlineSeconds,omitempty"`

	// The grace period is the duration in seconds after the processes running in the pod are sent
	// a termination signal and the time when the processes are forcibly halted with a kill signal.
	TerminationGracePeriodSeconds *int64 `json:"terminationGracePeriodSeconds,omitempty"`

	// RouteTrackVirtualService when set to true, will update Route status with VirtualService conditions.
	RouteTrackVirtualService bool `json:"routeTrackVirtualService,omitempty"`

	// RouteDisbaleRetries disables retries in the VirtualServices that route traffic to apps.
	// By default, Kf leaves the value unset and it's inherited from Istio.
	RouteDisableRetries bool `json:"routeDisableRetries,omitempty"`

	// RouteHostIgnoringPort determines whether requests are routed ignoring any ports in the Host header.
	// By default (false value), the Host header value has to match exactly the preconfigured route host.
	// e.g By default example.com:443 does not match with a route configured with a Host of example.com.
	RouteHostIgnoringPort bool `json:"routeHostIgnoringPort,omitempty"`

	// TaskDefaultTimeoutMinutes sets the cluster-wide timeout for tasks.
	// If the value is null, the timeout is inherited from Tekton.
	// If the value is <= 0, then an infinite timeout is set.
	TaskDefaultTimeoutMinutes *int32 `json:"taskDefaultTimeoutMinutes,omitempty"`

	// TaskDisableVolumeMounts disables mounting NFS volumes in Tasks.
	// Mounting NFS volumes requires FUSE which grants Task Pods additional
	// system privileges.
	TaskDisableVolumeMounts bool `json:"taskDisableVolumeMounts,omitempty"`
}

DefaultsConfig contains the configuration for defaults.

func BuiltinDefaultsConfig

func BuiltinDefaultsConfig() *DefaultsConfig

BuiltinDefaultsConfig creates a defaults configuration with default values.

func NewDefaultsConfigFromConfigMap

func NewDefaultsConfigFromConfigMap(configMap *corev1.ConfigMap) (*DefaultsConfig, error)

NewDefaultsConfigFromConfigMap creates a DefaultsConfig from the supplied ConfigMap with defaults provided by DefaultSpaceConfig for any blank fields.

func (*DefaultsConfig) DeepCopy

func (in *DefaultsConfig) DeepCopy() *DefaultsConfig

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DefaultsConfig.

func (*DefaultsConfig) DeepCopyInto

func (in *DefaultsConfig) DeepCopyInto(out *DefaultsConfig)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

func (*DefaultsConfig) PatchConfigMap

func (defaultsConfig *DefaultsConfig) PatchConfigMap(cm *corev1.ConfigMap) error

PatchConfigMap merges values from a DefaultsConfig onto a v1.ConfigMap. This updates the keys that are part of DefaultsConfig while leaving the rest of the original v1.ConfigMap (such as _example) untouched.

type DomainTemplate

type DomainTemplate struct {
	// Domain is the valid domain that can be used in conjunction with a
	// hostname and path for a route.
	Domain string `json:"domain"`
	// GatewayName is the name of the Istio Gateway supported by the domain.
	// Values can include a Namespace as a prefix.
	// Only the kf Namespace is allowed e.g. kf/some-gateway.
	// See https://istio.io/docs/reference/config/networking/gateway/
	GatewayName string `json:"gatewayName,omitempty"`
}

DomainTemplate mimics the structure of v1alpha1.SpaceDomain

func (*DomainTemplate) DeepCopy

func (in *DomainTemplate) DeepCopy() *DomainTemplate

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DomainTemplate.

func (*DomainTemplate) DeepCopyInto

func (in *DomainTemplate) DeepCopyInto(out *DomainTemplate)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

type FeatureFlag

type FeatureFlag struct {
	Name    string `json:"name"`
	Default bool   `json:"default"`
	// contains filtered or unexported fields
}

FeatureFlag is the internal representation of a feature flag. If a feature flag is not set in the config-defaults ConfigMap, the value of the flag internally is still defaulted. +k8s:deepcopy-gen=false

func (*FeatureFlag) IsDisabled

func (ff *FeatureFlag) IsDisabled() bool

IsDisabled returns whether or not the feature is disabled.

func (*FeatureFlag) IsEnabled

func (ff *FeatureFlag) IsEnabled() bool

IsEnabled returns whether or not the feature is enabled.

type FeatureFlagToggles

type FeatureFlagToggles map[string]bool

FeatureFlagToggles maps a feature name to a bool representing whether the feature is enabled.

func (FeatureFlagToggles) AppDevExperienceBuilds

func (fft FeatureFlagToggles) AppDevExperienceBuilds() *FeatureFlag

AppDevExperienceBuilds returns the FeatureFlag for enabling the AppDevExperience Builds system (instead of the built-in Kf one).

func (FeatureFlagToggles) CustomBuildpacks

func (fft FeatureFlagToggles) CustomBuildpacks() *FeatureFlag

CustomBuildpacks returns the FeatureFlag for enabling buildpacks outside of the Space-configured ones,

func (FeatureFlagToggles) CustomStacks

func (fft FeatureFlagToggles) CustomStacks() *FeatureFlag

CustomStacks returns the FeatureFlag for enabling stacks outside of the Space-configured ones.,

func (FeatureFlagToggles) DeepCopy

func (in FeatureFlagToggles) DeepCopy() FeatureFlagToggles

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new FeatureFlagToggles.

func (FeatureFlagToggles) DeepCopyInto

func (in FeatureFlagToggles) DeepCopyInto(out *FeatureFlagToggles)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

func (FeatureFlagToggles) DisableCustomBuildsFlag

func (fft FeatureFlagToggles) DisableCustomBuildsFlag() *FeatureFlag

DisableCustomBuildsFlag returns the FeatureFlag for disabling custom builds.

func (FeatureFlagToggles) DockerfileBuilds

func (fft FeatureFlagToggles) DockerfileBuilds() *FeatureFlag

DockerfileBuilds returns the FeatureFlag for enabling docker image based builds.

func (FeatureFlagToggles) NfsService

func (fft FeatureFlagToggles) NfsService() *FeatureFlag

NfsService returns the FeatureFlag for enabling the NFS service as a User Provided Service.

func (FeatureFlagToggles) RouteServices

func (fft FeatureFlagToggles) RouteServices() *FeatureFlag

RouteServices returns the FeatureFlag for enabling route services.

func (FeatureFlagToggles) SetAppDevExperienceBuilds

func (fft FeatureFlagToggles) SetAppDevExperienceBuilds(enabled bool)

SetAppDevExperienceBuilds sets the value for the AppDevExperienceBuilds feature flag on a FeatureFlagToggles map.

func (FeatureFlagToggles) SetCustomBuildpacks

func (fft FeatureFlagToggles) SetCustomBuildpacks(enabled bool)

SetCustomBuildpacks sets the value for the custom buildpack feature flag on a FeatureFlagToggles map.

func (FeatureFlagToggles) SetCustomStacks

func (fft FeatureFlagToggles) SetCustomStacks(enabled bool)

SetCustomStacks sets the value for the custom stack feature flag on a FeatureFlagToggles map.

func (FeatureFlagToggles) SetDisableCustomBuilds

func (fft FeatureFlagToggles) SetDisableCustomBuilds(disabled bool)

SetDisableCustomBuilds sets the value for the custom build disabling feature flag on a FeatureFlagToggles map.

func (FeatureFlagToggles) SetDockerfileBuilds

func (fft FeatureFlagToggles) SetDockerfileBuilds(enabled bool)

SetDockerfileBuilds sets the value for the docker build feature flag on a FeatureFlagToggles map.

func (FeatureFlagToggles) SetNfsService

func (fft FeatureFlagToggles) SetNfsService(toggle bool)

SetNfsService sets the value for the NFS service feature flag on a FeatureFlagToggles map.

func (FeatureFlagToggles) SetRouteServices

func (fft FeatureFlagToggles) SetRouteServices(toggle bool)

SetRouteServices sets the value for the route services feature flag on a FeatureFlagToggles map.

type StackV2Definition

type StackV2Definition struct {
	Name         string            `json:"name"`
	Image        string            `json:"image"`
	Description  string            `json:"description,omitempty"`
	NodeSelector map[string]string `json:"nodeSelector,omitempty"`
}

StackV2Definition contains the definition of a stack.

func (*StackV2Definition) DeepCopy

func (in *StackV2Definition) DeepCopy() *StackV2Definition

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new StackV2Definition.

func (*StackV2Definition) DeepCopyInto

func (in *StackV2Definition) DeepCopyInto(out *StackV2Definition)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

func (*StackV2Definition) Validate

func (defn *StackV2Definition) Validate(ctx context.Context) (err *apis.FieldError)

Validate implements apis.Validatable

type StackV2List

type StackV2List []StackV2Definition

StackV2List holds an array of StackV2Definition. Its primary use is doing validation over a list of Stacks.

func (StackV2List) DeepCopy

func (in StackV2List) DeepCopy() StackV2List

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new StackV2List.

func (StackV2List) DeepCopyInto

func (in StackV2List) DeepCopyInto(out *StackV2List)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

func (StackV2List) FindStackByName

func (list StackV2List) FindStackByName(name string) *StackV2Definition

FindStackByName returns the first stack with the given name or nil if none exists.

Example
list := StackV2List{
	{
		Name:  "cflinuxfs3",
		Image: "cloudfoundry/cflinuxfs3",
	},
}

fmt.Println("doesn't exist:", list.FindStackByName("does-not-exist"))
fmt.Println("exists image:", list.FindStackByName("cflinuxfs3").Image)
Output:

doesn't exist: <nil>
exists image: cloudfoundry/cflinuxfs3

func (StackV2List) Validate

func (list StackV2List) Validate(ctx context.Context) (err *apis.FieldError)

Validate implements apis.Validatable

type StackV3Definition

type StackV3Definition struct {
	Name         string            `json:"name"`
	Description  string            `json:"description,omitempty"`
	BuildImage   string            `json:"buildImage"`
	RunImage     string            `json:"runImage"`
	NodeSelector map[string]string `json:"nodeSelector,omitempty"`
}

StackV3Definition contains the definition of a cloud native buildpack stack.

func (*StackV3Definition) DeepCopy

func (in *StackV3Definition) DeepCopy() *StackV3Definition

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new StackV3Definition.

func (*StackV3Definition) DeepCopyInto

func (in *StackV3Definition) DeepCopyInto(out *StackV3Definition)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

func (*StackV3Definition) Validate

func (defn *StackV3Definition) Validate(ctx context.Context) (err *apis.FieldError)

Validate implements apis.Validatable

type StackV3List

type StackV3List []StackV3Definition

StackV3List holds an array of StackV3Definition. Its primary use is doing validation over a list of Stacks.

func (StackV3List) DeepCopy

func (in StackV3List) DeepCopy() StackV3List

DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new StackV3List.

func (StackV3List) DeepCopyInto

func (in StackV3List) DeepCopyInto(out *StackV3List)

DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.

func (StackV3List) Validate

func (list StackV3List) Validate(ctx context.Context) (err *apis.FieldError)

Validate implements apis.Validatable

type Store

type Store struct {
	*configmap.UntypedStore
}

Store is based on configmap.UntypedStore and is used to store and watch for updates to configuration related to defaults. +k8s:deepcopy-gen=false

func NewDefaultConfigStore

func NewDefaultConfigStore(logger configmap.Logger) *Store

NewDefaultConfigStore creates a config store populated with default keys and values.

func NewStore

func NewStore(logger configmap.Logger, onAfterStore ...func(name string, value interface{})) *Store

NewStore creates a configmap.UntypedStore based config store.

logger must be non-nil implementation of configmap.Logger (commonly used loggers conform)

onAfterStore is a variadic list of callbacks to run after the ConfigMap has been processed and stored.

See also: configmap.NewUntypedStore().

func (*Store) ToContext

func (s *Store) ToContext(ctx context.Context) context.Context

ToContext loads the DefaultsConfig from the store into the context. If there is an error loading the defaults config, the error is stored on the Config type.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL