~rogpeppe/juju-core/azure

« back to all changes in this revision

Viewing changes to environs/openstack/provider.go

[r=jtv] Unify providers' user-data composition functions.

All the "physical" providers (EC2, OpenStack, MAAS, Azure) were generating
user data in essentially the same way. The MAAS one looked different but
actually just added an optional bit that was still completely generic. And so
this branch unifies the implementations.

Construction of the cloudinit.MachineConfig was lifted out of the function.
That may seem arbitrary, but it's part of a greater plan: in a later step of
the ongoing refactoring the construction can be lifted out of the providers'
internalStartInstance methods as well, doing away with the EC2 and OpenStack
providers' startInstanceParams structs. This actually shortens some of the
data flows and reduces cognitive load, which can only be good for maintenance.

After that step we can have a fresh look at sanitizing NewMachineConfig (which
arguably should take more parameters, or not exist at all, but is in an
intermediate state that facilitates the changes happening now). We may also
look into re-introducing some sort of dedicated Parameter Object for
internalStartInstance, but by then the cluster of methods Bootstrap /
StartInstance / internalStartInstance will look a bit different and we can
find the most maintainable solution for that new situation.

Show diffs side-by-side

added added

removed removed

Lines of Context:
17
17
        "launchpad.net/goose/swift"
18
18
        "launchpad.net/juju-core/constraints"
19
19
        "launchpad.net/juju-core/environs"
20
 
        "launchpad.net/juju-core/environs/cloudinit"
21
20
        "launchpad.net/juju-core/environs/config"
22
21
        "launchpad.net/juju-core/environs/imagemetadata"
23
22
        "launchpad.net/juju-core/environs/instances"
631
630
        withPublicIP bool
632
631
}
633
632
 
634
 
// TODO(bug 1199847): Some of this work can be shared between providers.
635
 
func (e *environ) userData(scfg *startInstanceParams, tools *state.Tools) ([]byte, error) {
636
 
        mcfg := environs.NewMachineConfig(scfg.machineId, scfg.machineNonce, scfg.info, scfg.apiInfo)
637
 
        mcfg.StateServer = scfg.stateServer
638
 
        mcfg.Tools = tools
639
 
 
640
 
        if err := environs.FinishMachineConfig(mcfg, e.Config(), scfg.constraints); err != nil {
641
 
                return nil, err
642
 
        }
643
 
        cloudcfg, err := cloudinit.New(mcfg)
644
 
        if err != nil {
645
 
                return nil, err
646
 
        }
647
 
        data, err := cloudcfg.Render()
648
 
        if err != nil {
649
 
                return nil, err
650
 
        }
651
 
        cdata := utils.Gzip(data)
652
 
        log.Debugf("environs/openstack: openstack user data; %d bytes", len(cdata))
653
 
        return cdata, nil
654
 
}
655
 
 
656
633
// allocatePublicIP tries to find an available floating IP address, or
657
634
// allocates a new one, returning it, or an error
658
635
func (e *environ) allocatePublicIP() (*nova.FloatingIP, error) {
725
702
        if err != nil {
726
703
                return nil, nil, fmt.Errorf("chosen architecture %v not present in %v", spec.Image.Arch, arches)
727
704
        }
728
 
        userData, err := e.userData(scfg, tools[0])
 
705
 
 
706
        mcfg := environs.NewMachineConfig(scfg.machineId, scfg.machineNonce, scfg.info, scfg.apiInfo)
 
707
        mcfg.StateServer = scfg.stateServer
 
708
        mcfg.Tools = tools[0]
 
709
 
 
710
        if err := environs.FinishMachineConfig(mcfg, e.Config(), scfg.constraints); err != nil {
 
711
                return nil, nil, err
 
712
        }
 
713
        userData, err := environs.ComposeUserData(mcfg)
729
714
        if err != nil {
730
715
                return nil, nil, fmt.Errorf("cannot make user data: %v", err)
731
716
        }
 
717
        log.Debugf("environs/openstack: openstack user data; %d bytes", len(userData))
 
718
 
732
719
        var publicIP *nova.FloatingIP
733
720
        if scfg.withPublicIP {
734
721
                if fip, err := e.allocatePublicIP(); err != nil {