@ -112,6 +112,49 @@ func (c *Core) BuildNames() []string {
return r
}
func ( c * Core ) generateCoreBuildProvisioner ( rawP * template . Provisioner , rawName string ) ( coreBuildProvisioner , error ) {
// Get the provisioner
cbp := coreBuildProvisioner { }
provisioner , err := c . components . Provisioner ( rawP . Type )
if err != nil {
return cbp , fmt . Errorf (
"error initializing provisioner '%s': %s" ,
rawP . Type , err )
}
if provisioner == nil {
return cbp , fmt . Errorf (
"provisioner type not found: %s" , rawP . Type )
}
// Get the configuration
config := make ( [ ] interface { } , 1 , 2 )
config [ 0 ] = rawP . Config
if rawP . Override != nil {
if override , ok := rawP . Override [ rawName ] ; ok {
config = append ( config , override )
}
}
// If we're pausing, we wrap the provisioner in a special pauser.
if rawP . PauseBefore > 0 {
provisioner = & PausedProvisioner {
PauseBefore : rawP . PauseBefore ,
Provisioner : provisioner ,
}
} else if rawP . Timeout > 0 {
provisioner = & TimeoutProvisioner {
Timeout : rawP . Timeout ,
Provisioner : provisioner ,
}
}
cbp = coreBuildProvisioner {
pType : rawP . Type ,
provisioner : provisioner ,
config : config ,
}
return cbp , nil
}
// Build returns the Build object for the given name.
func ( c * Core ) Build ( n string ) ( Build , error ) {
// Setup the builder
@ -140,46 +183,23 @@ func (c *Core) Build(n string) (Build, error) {
if rawP . OnlyExcept . Skip ( rawName ) {
continue
}
// Get the provisioner
provisioner , err := c . components . Provisioner ( rawP . Type )
cbp , err := c . generateCoreBuildProvisioner ( rawP , rawName )
if err != nil {
return nil , fmt . Errorf (
"error initializing provisioner '%s': %s" ,
rawP . Type , err )
}
if provisioner == nil {
return nil , fmt . Errorf (
"provisioner type not found: %s" , rawP . Type )
return nil , err
}
// Get the configuration
config := make ( [ ] interface { } , 1 , 2 )
config [ 0 ] = rawP . Config
if rawP . Override != nil {
if override , ok := rawP . Override [ rawName ] ; ok {
config = append ( config , override )
}
}
provisioners = append ( provisioners , cbp )
}
// If we're pausing, we wrap the provisioner in a special pauser.
if rawP . PauseBefore > 0 {
provisioner = & PausedProvisioner {
PauseBefore : rawP . PauseBefore ,
Provisioner : provisioner ,
}
} else if rawP . Timeout > 0 {
provisioner = & TimeoutProvisioner {
Timeout : rawP . Timeout ,
Provisioner : provisioner ,
}
var cleanupProvisioner coreBuildProvisioner
if c . Template . CleanupProvisioner != nil {
// This is a special instantiation of the shell-local provisioner that
// is only run on error at end of provisioning step before other step
// cleanup occurs.
cleanupProvisioner , err = c . generateCoreBuildProvisioner ( c . Template . CleanupProvisioner , rawName )
if err != nil {
return nil , err
}
provisioners = append ( provisioners , coreBuildProvisioner {
pType : rawP . Type ,
provisioner : provisioner ,
config : config ,
} )
}
// Setup the post-processors
@ -232,14 +252,15 @@ func (c *Core) Build(n string) (Build, error) {
// TODO hooks one day
return & coreBuild {
name : n ,
builder : builder ,
builderConfig : configBuilder . Config ,
builderType : configBuilder . Type ,
postProcessors : postProcessors ,
provisioners : provisioners ,
templatePath : c . Template . Path ,
variables : c . variables ,
name : n ,
builder : builder ,
builderConfig : configBuilder . Config ,
builderType : configBuilder . Type ,
postProcessors : postProcessors ,
provisioners : provisioners ,
cleanupProvisioner : cleanupProvisioner ,
templatePath : c . Template . Path ,
variables : c . variables ,
} , nil
}