~nskaggs/+junk/xenial-test

« back to all changes in this revision

Viewing changes to src/github.com/juju/juju/cloudconfig/cloudinit/helpers.go

  • Committer: Nicholas Skaggs
  • Date: 2016-10-24 20:56:05 UTC
  • Revision ID: nicholas.skaggs@canonical.com-20161024205605-z8lta0uvuhtxwzwl
Initi with beta15

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
// Copyright 2015 Canonical Ltd.
 
2
// Copyright 2015 Cloudbase Solutions SRL
 
3
// Licensed under the AGPLv3, see LICENCE file for details.
 
4
 
 
5
package cloudinit
 
6
 
 
7
import (
 
8
        "strings"
 
9
 
 
10
        "github.com/juju/utils/packaging/config"
 
11
        "github.com/juju/utils/proxy"
 
12
)
 
13
 
 
14
// addPackageCommandsCommon is a helper function which applies the given
 
15
// packaging-related options to the given CloudConfig.
 
16
func addPackageCommandsCommon(
 
17
        cfg CloudConfig,
 
18
        packageProxySettings proxy.Settings,
 
19
        packageMirror string,
 
20
        addUpdateScripts bool,
 
21
        addUpgradeScripts bool,
 
22
        series string,
 
23
) {
 
24
        // Set the package mirror.
 
25
        cfg.SetPackageMirror(packageMirror)
 
26
 
 
27
        // For LTS series which need support for the cloud-tools archive,
 
28
        // we need to enable package-list update regardless of the environ
 
29
        // setting, otherwise bootstrap or provisioning will fail.
 
30
        if config.SeriesRequiresCloudArchiveTools(series) && !addUpdateScripts {
 
31
                addUpdateScripts = true
 
32
        }
 
33
 
 
34
        // Bring packages up-to-date.
 
35
        cfg.SetSystemUpdate(addUpdateScripts)
 
36
        cfg.SetSystemUpgrade(addUpgradeScripts)
 
37
 
 
38
        // Always run this step - this is where we install packages that juju
 
39
        // requires.
 
40
        cfg.addRequiredPackages()
 
41
 
 
42
        // TODO(bogdanteleaga): Deal with proxy settings on CentOS
 
43
        cfg.updateProxySettings(packageProxySettings)
 
44
}
 
45
 
 
46
// renderScriptCommon is a helper function which generates a bash script that
 
47
// applies all the settings given by the provided CloudConfig when run.
 
48
func renderScriptCommon(cfg CloudConfig) (string, error) {
 
49
        // TODO(axw): 2013-08-23 bug 1215777
 
50
        // Carry out configuration for ssh-keys-per-user,
 
51
        // machine-updates-authkeys, using cloud-init config.
 
52
        //
 
53
        // We should work with smoser to get a supported
 
54
        // command in (or next to) cloud-init for manually
 
55
        // invoking cloud-config. This would address the
 
56
        // above comment by removing the need to generate a
 
57
        // script "by hand".
 
58
 
 
59
        // Bootcmds must be run before anything else,
 
60
        // as they may affect package installation.
 
61
        bootcmds := cfg.BootCmds()
 
62
 
 
63
        // Depending on cfg, potentially add package sources and packages.
 
64
        pkgcmds, err := cfg.getCommandsForAddingPackages()
 
65
        if err != nil {
 
66
                return "", err
 
67
        }
 
68
 
 
69
        // Runcmds come last.
 
70
        runcmds := cfg.RunCmds()
 
71
 
 
72
        // We prepend "set -xe". This is already in runcmds,
 
73
        // but added here to avoid relying on that to be
 
74
        // invariant.
 
75
        script := []string{"#!/bin/bash", "set -e"}
 
76
        // We must initialise progress reporting before entering
 
77
        // the subshell and redirecting stderr.
 
78
        script = append(script, InitProgressCmd())
 
79
        stdout, stderr := cfg.Output(OutAll)
 
80
        script = append(script, "(")
 
81
        if stderr != "" {
 
82
                script = append(script, "(")
 
83
        }
 
84
        script = append(script, bootcmds...)
 
85
        script = append(script, pkgcmds...)
 
86
        script = append(script, runcmds...)
 
87
        if stderr != "" {
 
88
                script = append(script, ") "+stdout)
 
89
                script = append(script, ") "+stderr)
 
90
        } else {
 
91
                script = append(script, ") "+stdout+" 2>&1")
 
92
        }
 
93
        return strings.Join(script, "\n"), nil
 
94
}
 
95
 
 
96
func copyStringSlice(s []string) []string {
 
97
        if s == nil {
 
98
                return nil
 
99
        }
 
100
        res := make([]string, len(s))
 
101
        for i, item := range s {
 
102
                res[i] = item
 
103
        }
 
104
        return res
 
105
}