package config import ( "gerrit.wikimedia.org/r/blubber/build" ) // CommonConfig holds the configuration fields common to both the root config // and each configured variant. // type CommonConfig struct { Base string `json:"base" validate:"omitempty,baseimage"` // name/path to base image Apt AptConfig `json:"apt"` // APT related Node NodeConfig `json:"node"` // Node related Python PythonConfig `json:"python"` // Python related Builder BuilderConfig `json:"builder"` // Builder related Lives LivesConfig `json:"lives"` // application owner/dir Runs RunsConfig `json:"runs"` // runtime environment EntryPoint []string `json:"entrypoint"` // entry-point executable } // Merge takes another CommonConfig and merges its fields this one's. // func (cc *CommonConfig) Merge(cc2 CommonConfig) { if cc2.Base != "" { cc.Base = cc2.Base } cc.Apt.Merge(cc2.Apt) cc.Node.Merge(cc2.Node) cc.Python.Merge(cc2.Python) cc.Builder.Merge(cc2.Builder) cc.Lives.Merge(cc2.Lives) cc.Runs.Merge(cc2.Runs) if cc2.EntryPoint != nil { cc.EntryPoint = cc2.EntryPoint } } // PhaseCompileableConfig returns all fields that implement // build.PhaseCompileable in the order that their instructions should be // injected. // func (cc *CommonConfig) PhaseCompileableConfig() []build.PhaseCompileable { return []build.PhaseCompileable{cc.Apt, cc.Node, cc.Python, cc.Builder, cc.Lives, cc.Runs} } // InstructionsForPhase injects instructions into the given build phase for // each member field that supports it. // func (cc *CommonConfig) InstructionsForPhase(phase build.Phase) []build.Instruction { instructions := []build.Instruction{} for _, phaseCompileable := range cc.PhaseCompileableConfig() { instructions = append(instructions, phaseCompileable.InstructionsForPhase(phase)...) } return instructions }