Documentation
¶
Overview ¶
Package config knows how to read and parse config.yaml.
Index ¶
- func BranchRequirements(org, repo, branch string, presubmits map[string][]Presubmit) ([]string, []string)
- func SetRegexes(js []Presubmit) error
- func ValidateController(c *Controller) error
- type Agent
- type Branch
- type BranchProtection
- type Brancher
- type Branding
- type ChangedFilesProvider
- type Config
- func (c *Config) AllPeriodics() []Periodic
- func (c *Config) AllPostsubmits(repos []string) []Postsubmit
- func (c *Config) AllPresubmits(repos []string) []Presubmit
- func (c *Config) GetBranchProtection(org, repo, branch string) (*Policy, error)
- func (c *Config) GetPresubmit(repo, jobName string) *Presubmit
- func (c Config) GetTideContextPolicy(org, repo, branch string) (TideContextPolicy, error)
- func (c *Config) MatchingPresubmits(fullRepoName, body string, testAll bool) []Presubmit
- func (c *Config) RetestPresubmits(fullRepoName string, skipContexts, runContexts map[string]bool) []Presubmit
- func (c *Config) SetPresubmits(jobs map[string][]Presubmit) error
- type ContextPolicy
- type Controller
- type Cookie
- type Deck
- type ExternalAgentLog
- type Gerrit
- type GithubOAuthConfig
- type JenkinsOperator
- type Org
- type OwnersDirBlacklist
- type Periodic
- type Plank
- type Policy
- type Postsubmit
- type Preset
- type Presubmit
- type PushGateway
- type QueryMap
- type Repo
- type Restrictions
- type ReviewPolicy
- type Sinker
- type Tide
- type TideContextPolicy
- type TideContextPolicyOptions
- type TideOrgContextPolicy
- type TideQueries
- type TideQuery
- type TideRepoContextPolicy
- type UtilityConfig
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func BranchRequirements ¶
func BranchRequirements(org, repo, branch string, presubmits map[string][]Presubmit) ([]string, []string)
BranchRequirements returns required and optional presubmits prow jobs for a given org, repo branch.
func SetRegexes ¶
SetRegexes compiles and validates all the regural expressions for the provided presubmits.
func ValidateController ¶
func ValidateController(c *Controller) error
ValidateController validates the provided controller config.
Types ¶
type Agent ¶
Agent watches a path and automatically loads the config stored therein.
type BranchProtection ¶
type BranchProtection struct { Policy ProtectTested bool `json:"protect-tested-repos,omitempty"` Orgs map[string]Org `json:"orgs,omitempty"` AllowDisabledPolicies bool `json:"allow_disabled_policies,omitempty"` // contains filtered or unexported fields }
BranchProtection specifies the global branch protection policy
type Brancher ¶
type Brancher struct { // Do not run against these branches. Default is no branches. SkipBranches []string `json:"skip_branches"` // Only run against these branches. Default is all branches. Branches []string `json:"branches"` }
Brancher is for shared code between jobs that only run against certain branches. An empty brancher runs against all branches.
func (Brancher) RunsAgainstAllBranch ¶
func (Brancher) RunsAgainstBranch ¶
type Branding ¶
type Branding struct { // Logo is the location of the logo that will be loaded in deck. Logo string `json:"logo,omitempty"` // Favicon is the location of the favicon that will be loaded in deck. Favicon string `json:"favicon,omitempty"` // BackgroundColor is the color of the background. BackgroundColor string `json:"background_color,omitempty"` // HeaderColor is the color of the header. HeaderColor string `json:"header_color,omitempty"` }
Branding holds branding configuration for deck.
type ChangedFilesProvider ¶
type Config ¶
type Config struct { // Presets apply to all job types. Presets []Preset `json:"presets,omitempty"` // Full repo name (such as "kubernetes/kubernetes") -> list of jobs. Presubmits map[string][]Presubmit `json:"presubmits,omitempty"` Postsubmits map[string][]Postsubmit `json:"postsubmits,omitempty"` // Periodics are not associated with any repo. Periodics []Periodic `json:"periodics,omitempty"` Tide Tide `json:"tide,omitempty"` Plank Plank `json:"plank,omitempty"` Sinker Sinker `json:"sinker,omitempty"` Deck Deck `json:"deck,omitempty"` BranchProtection BranchProtection `json:"branch-protection,omitempty"` Orgs map[string]org.Config `json:"orgs,omitempty"` Gerrit Gerrit `json:"gerrit,omitempty"` // TODO: Move this out of the main config. JenkinsOperators []JenkinsOperator `json:"jenkins_operators,omitempty"` // ProwJobNamespace is the namespace in the cluster that prow // components will use for looking up ProwJobs. The namespace // needs to exist and will not be created by prow. // Defaults to "default". ProwJobNamespace string `json:"prowjob_namespace,omitempty"` // PodNamespace is the namespace in the cluster that prow // components will use for looking up Pods owned by ProwJobs. // The namespace needs to exist and will not be created by prow. // Defaults to "default". PodNamespace string `json:"pod_namespace,omitempty"` // LogLevel enables dynamically updating the log level of the // standard logger that is used by all prow components. // // Valid values: // // "debug", "info", "warn", "warning", "error", "fatal", "panic" // // Defaults to "info". LogLevel string `json:"log_level,omitempty"` // PushGateway is a prometheus push gateway. PushGateway PushGateway `json:"push_gateway,omitempty"` // OwnersDirBlacklist is used to configure which directories to ignore when // searching for OWNERS{,_ALIAS} files in a repo. OwnersDirBlacklist OwnersDirBlacklist `json:"owners_dir_blacklist,omitempty"` }
Config is a read-only snapshot of the config.
func (*Config) AllPeriodics ¶
AllPostsubmits returns all prow periodic jobs.
func (*Config) AllPostsubmits ¶
func (c *Config) AllPostsubmits(repos []string) []Postsubmit
AllPostsubmits returns all prow postsubmit jobs in repos. if repos is empty, return all postsubmits.
func (*Config) AllPresubmits ¶
AllPresubmits returns all prow presubmit jobs in repos. if repos is empty, return all presubmits.
func (*Config) GetBranchProtection ¶
func (*Config) GetPresubmit ¶
GetPresubmit returns the presubmit job for the provided repo and job name.
func (Config) GetTideContextPolicy ¶
func (c Config) GetTideContextPolicy(org, repo, branch string) (TideContextPolicy, error)
GetTideContextPolicy parses the prow config to find context merge options. If none are set, it will use the prow jobs configured and use the default github combined status. Otherwise if set it will use the branch protection setting, or the listed jobs.
func (*Config) MatchingPresubmits ¶
func (*Config) RetestPresubmits ¶
func (c *Config) RetestPresubmits(fullRepoName string, skipContexts, runContexts map[string]bool) []Presubmit
RetestPresubmits returns all presubmits that should be run given a /retest command. This is the set of all presubmits intersected with ((alwaysRun + runContexts) - skipContexts)
type ContextPolicy ¶
type ContextPolicy struct { // Contexts appends required contexts that must be green to merge Contexts []string `json:"contexts,omitempty"` // Strict overrides whether new commits in the base branch require updating the PR if set Strict *bool `json:"strict,omitempty"` }
ContextPolicy configures required github contexts. When merging policies, contexts are appended to context list from parent. Strict determines whether merging to the branch invalidates existing contexts.
type Controller ¶
type Controller struct { // JobURLTemplateString compiles into JobURLTemplate at load time. JobURLTemplateString string `json:"job_url_template,omitempty"` // JobURLTemplate is compiled at load time from JobURLTemplateString. It // will be passed a kube.ProwJob and is used to set the URL for the // "Details" link on GitHub as well as the link from deck. JobURLTemplate *template.Template `json:"-"` // ReportTemplateString compiles into ReportTemplate at load time. ReportTemplateString string `json:"report_template,omitempty"` // ReportTemplate is compiled at load time from ReportTemplateString. It // will be passed a kube.ProwJob and can provide an optional blurb below // the test failures comment. ReportTemplate *template.Template `json:"-"` // MaxConcurrency is the maximum number of tests running concurrently that // will be allowed by the controller. 0 implies no limit. MaxConcurrency int `json:"max_concurrency,omitempty"` // MaxGoroutines is the maximum number of goroutines spawned inside the // controller to handle tests. Defaults to 20. Needs to be a positive // number. MaxGoroutines int `json:"max_goroutines,omitempty"` // AllowCancellations enables aborting presubmit jobs for commits that // have been superseded by newer commits in Github pull requests. AllowCancellations bool `json:"allow_cancellations,omitempty"` }
Controller holds configuration applicable to all agent-specific prow controllers.
type Deck ¶
type Deck struct { // TideUpdatePeriodString compiles into TideUpdatePeriod at load time. TideUpdatePeriodString string `json:"tide_update_period,omitempty"` // TideUpdatePeriod specifies how often Deck will fetch status from Tide. Defaults to 10s. TideUpdatePeriod time.Duration `json:"-"` // HiddenRepos is a list of orgs and/or repos that should not be displayed by Deck. HiddenRepos []string `json:"hidden_repos,omitempty"` // ExternalAgentLogs ensures external agents can expose // their logs in prow. ExternalAgentLogs []ExternalAgentLog `json:"external_agent_logs,omitempty"` // Branding of the frontend Branding *Branding `json:"branding,omitempty"` }
Deck holds config for deck.
type ExternalAgentLog ¶
type ExternalAgentLog struct { // Agent is an external prow agent that supports exposing // logs via deck. Agent string `json:"agent,omitempty"` // SelectorString compiles into Selector at load time. SelectorString string `json:"selector,omitempty"` // Selector can be used in prow deployments where the workload has // been sharded between controllers of the same agent. For more info // see https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#label-selectors Selector labels.Selector `json:"-"` // URLTemplateString compiles into URLTemplate at load time. URLTemplateString string `json:"url_template,omitempty"` // URLTemplate is compiled at load time from URLTemplateString. It // will be passed a kube.ProwJob and the generated URL should provide // logs for the ProwJob. URLTemplate *template.Template `json:"-"` }
ExternalAgentLog ensures an external agent like Jenkins can expose its logs in prow.
type Gerrit ¶
type Gerrit struct { // TickInterval is how often we do a sync with binded gerrit instance TickIntervalString string `json:"tick_interval,omitempty"` TickInterval time.Duration `json:"-"` // RateLimit defines how many changes to query per gerrit API call // default is 5 RateLimit int `json:"ratelimit,omitempty"` }
Gerrit is config for the gerrit controller.
type GithubOAuthConfig ¶
type GithubOAuthConfig struct { ClientID string `json:"client_id"` ClientSecret string `json:"client_secret"` RedirectURL string `json:"redirect_url"` Scopes []string `json:"scopes,omitempty"` FinalRedirectURL string `json:"final_redirect_url"` CookieStore *sessions.CookieStore `json:"-"` }
GithubOAuthConfig is a config for requesting users access tokens from Github API. It also has a Cookie Store that retains user credentials deriving from Github API.
func (*GithubOAuthConfig) InitGithubOAuthConfig ¶
func (gac *GithubOAuthConfig) InitGithubOAuthConfig(cookie *sessions.CookieStore)
Initialise a GithubOAuthConfig. It creates a OAuthClient using GithubOAuth config and a Cookie Store to retain user credentials.
type JenkinsOperator ¶
type JenkinsOperator struct { Controller `json:",inline"` // LabelSelectorString compiles into LabelSelector at load time. // If set, this option needs to match --label-selector used by // the desired jenkins-operator. This option is considered // invalid when provided with a single jenkins-operator config. // // For label selector syntax, see below: // https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#label-selectors LabelSelectorString string `json:"label_selector,omitempty"` // LabelSelector is used so different jenkins-operator replicas // can use their own configuration. LabelSelector labels.Selector `json:"-"` }
JenkinsOperator is config for the jenkins-operator controller.
type OwnersDirBlacklist ¶
type OwnersDirBlacklist struct { // Repos configures a directory blacklist per repo (or org) Repos map[string][]string `json:"repos"` // Default configures a default blacklist for repos (or orgs) not // specifically configured Default []string `json:"default"` }
OwnersDirBlacklist is used to configure which directories to ignore when searching for OWNERS{,_ALIAS} files in a repo.
type Periodic ¶
type Periodic struct { Name string `json:"name"` // Labels are added in prowjobs created for this job. Labels map[string]string `json:"labels"` // Agent that will take care of running this job. Agent string `json:"agent"` // Cluster is the alias of the cluster to run this job in. (Default: kube.DefaultClusterAlias) Cluster string `json:"cluster"` // Kubernetes pod spec. Spec *v1.PodSpec `json:"spec,omitempty"` // (deprecated)Interval to wait between two runs of the job. Interval string `json:"interval"` // Cron representation of job trigger time Cron string `json:"cron"` // Tags for config entries Tags []string `json:"tags,omitempty"` // Run these jobs after successfully running this one. RunAfterSuccess []Periodic `json:"run_after_success"` UtilityConfig // contains filtered or unexported fields }
Periodic runs on a timer.
func (*Periodic) GetInterval ¶
func (*Periodic) SetInterval ¶
type Plank ¶
type Plank struct { Controller `json:",inline"` // PodPendingTimeoutString compiles into PodPendingTimeout at load time. PodPendingTimeoutString string `json:"pod_pending_timeout,omitempty"` // PodPendingTimeout is after how long the controller will perform a garbage // collection on pending pods. Defaults to one day. PodPendingTimeout time.Duration `json:"-"` // DefaultDecorationConfig are defaults for shared fields for ProwJobs // that request to have their PodSpecs decorated DefaultDecorationConfig *kube.DecorationConfig `json:"default_decoration_config,omitempty"` }
Plank is config for the plank controller.
type Policy ¶
type Policy struct { // Protect overrides whether branch protection is enabled if set. Protect *bool `json:"protect,omitempty"` // RequiredStatusChecks configures github contexts RequiredStatusChecks *ContextPolicy `json:"required_status_checks,omitempty"` // Admins overrides whether protections apply to admins if set. Admins *bool `json:"enforce_admins,omitempty"` // Restrictions limits who can merge Restrictions *Restrictions `json:"restrictions,omitempty"` // RequiredPullRequestReviews specifies github approval/review criteria. RequiredPullRequestReviews *ReviewPolicy `json:"required_pull_request_reviews,omitempty"` // contains filtered or unexported fields }
Policy for the config/org/repo/branch. When merging policies, a nil value results in inheriting the parent policy.
func (Policy) HasProtect ¶
HasProtect returns true if the policy or deprecated policy defines protection
type Postsubmit ¶
type Postsubmit struct { Name string `json:"name"` // Labels are added in prowjobs created for this job. Labels map[string]string `json:"labels"` // Agent that will take care of running this job. Agent string `json:"agent"` // Cluster is the alias of the cluster to run this job in. (Default: kube.DefaultClusterAlias) Cluster string `json:"cluster"` // Kubernetes pod spec. Spec *v1.PodSpec `json:"spec,omitempty"` // Maximum number of this job running concurrently, 0 implies no limit. MaxConcurrency int `json:"max_concurrency"` Brancher UtilityConfig // Run these jobs after successfully running this one. RunAfterSuccess []Postsubmit `json:"run_after_success"` }
Postsubmit runs on push events.
type Preset ¶
type Preset struct { Labels map[string]string `json:"labels"` Env []v1.EnvVar `json:"env"` Volumes []v1.Volume `json:"volumes"` VolumeMounts []v1.VolumeMount `json:"volumeMounts"` }
Preset is intended to match the k8s' PodPreset feature, and may be removed if that feature goes beta.
type Presubmit ¶
type Presubmit struct { // eg kubernetes-pull-build-test-e2e-gce Name string `json:"name"` // Labels are added in prowjobs created for this job. Labels map[string]string `json:"labels"` // Run for every PR, or only when a comment triggers it. AlwaysRun bool `json:"always_run"` // Run if the PR modifies a file that matches this regex. RunIfChanged string `json:"run_if_changed"` // Context line for GitHub status. Context string `json:"context"` // eg @k8s-bot e2e test this Trigger string `json:"trigger"` // Valid rerun command to give users. Must match Trigger. RerunCommand string `json:"rerun_command"` // Whether or not to skip commenting and setting status on GitHub. SkipReport bool `json:"skip_report"` // Maximum number of this job running concurrently, 0 implies no limit. MaxConcurrency int `json:"max_concurrency"` // Agent that will take care of running this job. Agent string `json:"agent"` // Cluster is the alias of the cluster to run this job in. (Default: kube.DefaultClusterAlias) Cluster string `json:"cluster"` // Kubernetes pod spec. Spec *v1.PodSpec `json:"spec,omitempty"` // Run these jobs after successfully running this one. RunAfterSuccess []Presubmit `json:"run_after_success"` // Consider job optional for branch protection. Optional bool `json:"optional,omitempty"` Brancher UtilityConfig // contains filtered or unexported fields }
Presubmit is the job-specific trigger info.
func (Presubmit) ContextRequired ¶
ContextRequired checks whether a context is required from github points of view (required check).
func (Presubmit) RunsAgainstChanges ¶
func (Presubmit) TriggerMatches ¶
type PushGateway ¶
type PushGateway struct { // Endpoint is the location of the prometheus pushgateway // where prow will push metrics to. Endpoint string `json:"endpoint,omitempty"` // IntervalString compiles into Interval at load time. IntervalString string `json:"interval,omitempty"` // Interval specifies how often prow will push metrics // to the pushgateway. Defaults to 1m. Interval time.Duration `json:"-"` }
PushGateway is a prometheus push gateway.
type QueryMap ¶
type QueryMap map[string]TideQueries
QueryMap is a mapping from ("org/repo" or "org") -> TideQueries that apply to that org or repo.
func (QueryMap) ForRepo ¶
func (qm QueryMap) ForRepo(org, repo string) TideQueries
ForRepo returns the tide queries that apply to a repo.
type Restrictions ¶
Restrictions limits who can merge Users and Teams items are appended to parent lists.
type ReviewPolicy ¶
type ReviewPolicy struct { // Restrictions appends users/teams that are allowed to merge DismissalRestrictions *Restrictions `json:"dismissal_restrictions,omitempty"` // DismissStale overrides whether new commits automatically dismiss old reviews if set DismissStale *bool `json:"dismiss_stale_reviews,omitempty"` // RequireOwners overrides whether CODEOWNERS must approve PRs if set RequireOwners *bool `json:"require_code_owner_reviews,omitempty"` // Approvals overrides the number of approvals required if set (set to 0 to disable) Approvals *int `json:"required_approving_review_count,omitempty"` }
ReviewPolicy specifies github approval/review criteria. Any nil values inherit the policy from the parent, otherwise bool/ints are overridden. Non-empty lists are appended to parent lists.
type Sinker ¶
type Sinker struct { // ResyncPeriodString compiles into ResyncPeriod at load time. ResyncPeriodString string `json:"resync_period,omitempty"` // ResyncPeriod is how often the controller will perform a garbage // collection. Defaults to one hour. ResyncPeriod time.Duration `json:"-"` // MaxProwJobAgeString compiles into MaxProwJobAge at load time. MaxProwJobAgeString string `json:"max_prowjob_age,omitempty"` // MaxProwJobAge is how old a ProwJob can be before it is garbage-collected. // Defaults to one week. MaxProwJobAge time.Duration `json:"-"` // MaxPodAgeString compiles into MaxPodAge at load time. MaxPodAgeString string `json:"max_pod_age,omitempty"` // MaxPodAge is how old a Pod can be before it is garbage-collected. // Defaults to one day. MaxPodAge time.Duration `json:"-"` }
Sinker is config for the sinker controller.
type Tide ¶
type Tide struct { // SyncPeriodString compiles into SyncPeriod at load time. SyncPeriodString string `json:"sync_period,omitempty"` // SyncPeriod specifies how often Tide will sync jobs with Github. Defaults to 1m. SyncPeriod time.Duration `json:"-"` // StatusUpdatePeriodString compiles into StatusUpdatePeriod at load time. StatusUpdatePeriodString string `json:"status_update_period,omitempty"` // StatusUpdatePeriod specifies how often Tide will update Github status contexts. // Defaults to the value of SyncPeriod. StatusUpdatePeriod time.Duration `json:"-"` // Queries must not overlap. It must be impossible for any two queries to // ever return the same PR. // TODO: This will only be possible when we allow specifying orgs. At that // point, verify the above condition. Queries TideQueries `json:"queries,omitempty"` // A key/value pair of an org/repo as the key and merge method to override // the default method of merge. Valid options are squash, rebase, and merge. MergeType map[string]github.PullRequestMergeType `json:"merge_method,omitempty"` // URL for tide status contexts. // We can consider allowing this to be set separately for separate repos, or // allowing it to be a template. TargetURL string `json:"target_url,omitempty"` // PRStatusBaseUrl is the base URL for the PR status page. // This is used to link to a merge requirements overview // in the tide status context. PRStatusBaseUrl string `json:"pr_status_base_url,omitempty"` // MaxGoroutines is the maximum number of goroutines spawned inside the // controller to handle org/repo:branch pools. Defaults to 20. Needs to be a // positive number. MaxGoroutines int `json:"max_goroutines,omitempty"` // TideContextPolicyOptions defines merge options for context. If not set it will infer // the required and optional contexts from the prow jobs configured and use the github // combined status; otherwise it may apply the branch protection setting or let user // define their own options in case branch protection is not used. ContextOptions TideContextPolicyOptions `json:"context_options,omitempty"` }
Tide is config for the tide pool.
func (*Tide) MergeMethod ¶
func (t *Tide) MergeMethod(org, repo string) github.PullRequestMergeType
MergeMethod returns the merge method to use for a repo. The default of merge is returned when not overridden.
type TideContextPolicy ¶
type TideContextPolicy struct { // whether to consider unknown contexts optional (skip) or required. SkipUnknownContexts *bool `json:"skip-unknown-contexts,omitempty"` RequiredContexts []string `json:"required-contexts,omitempty"` OptionalContexts []string `json:"optional-contexts,omitempty"` // Infer required and optional jobs from Branch Protection configuration FromBranchProtection *bool `json:"from-branch-protection,omitempty"` }
func (*TideContextPolicy) IsOptional ¶
func (cp *TideContextPolicy) IsOptional(c string) bool
IsOptional checks whether a context can be ignored. Will return true if - context is registered as optional - required contexts are registered and the context provided is not required Will return false otherwise. Every context is required.
func (*TideContextPolicy) MissingRequiredContexts ¶
func (cp *TideContextPolicy) MissingRequiredContexts(contexts []string) []string
MissingRequiredContexts discard the optional contexts and only look of extra required contexts that are not provided.
func (*TideContextPolicy) Validate ¶
func (c *TideContextPolicy) Validate() error
type TideContextPolicyOptions ¶
type TideContextPolicyOptions struct { TideContextPolicy // Github Orgs Orgs map[string]TideOrgContextPolicy `json:"orgs,omitempty"` }
type TideOrgContextPolicy ¶
type TideOrgContextPolicy struct { TideContextPolicy Repos map[string]TideRepoContextPolicy `json:"repos,omitempty"` }
type TideQueries ¶
type TideQueries []TideQuery
func (TideQueries) AllPRsSince ¶
func (tqs TideQueries) AllPRsSince(t time.Time) string
AllPRsSince returns all open PRs in the repos covered by the query that have changed since time t.
func (TideQueries) QueryMap ¶
func (tqs TideQueries) QueryMap() QueryMap
QueryMap creates a QueryMap from TideQueries
type TideQuery ¶
type TideQuery struct { Orgs []string `json:"orgs,omitempty"` Repos []string `json:"repos,omitempty"` ExcludedBranches []string `json:"excludedBranches,omitempty"` IncludedBranches []string `json:"includedBranches,omitempty"` Labels []string `json:"labels,omitempty"` MissingLabels []string `json:"missingLabels,omitempty"` Milestone string `json:"milestone,omitempty"` ReviewApprovedRequired bool `json:"reviewApprovedRequired,omitempty"` }
TideQuery is turned into a GitHub search query. See the docs for details: https://help.github.com/articles/searching-issues-and-pull-requests/
type TideRepoContextPolicy ¶
type TideRepoContextPolicy struct { TideContextPolicy Branches map[string]TideContextPolicy `json:"branches,omitempty"` }
type UtilityConfig ¶
type UtilityConfig struct { // Decorate determines if we decorate the PodSpec or not Decorate bool `json:"decorate,omitempty"` // PathAlias is the location under <root-dir>/src // where the repository under test is cloned. If this // is not set, <root-dir>/src/github.com/org/repo will // be used as the default. PathAlias string `json:"path_alias,omitempty"` // CloneURI is the URI that is used to clone the // repository. If unset, will default to // `https://github.com/org/repo.git`. CloneURI string `json:"clone_uri,omitempty"` // ExtraRefs are auxiliary repositories that // need to be cloned, determined from config ExtraRefs []*kube.Refs `json:"extra_refs,omitempty"` // DecorationConfig holds configuration options for // decorating PodSpecs that users provide *kube.DecorationConfig }