Skip to content

Commit cf3ae33

Browse files
committed
Merge branch 'master' of https://github.com/juju/juju
2 parents 7f5f348 + 2e9c65c commit cf3ae33

File tree

107 files changed

+2225
-1508
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

107 files changed

+2225
-1508
lines changed

cert/cert.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ func NewCA(envName string, expiry time.Time) (certPEM, keyPEM string, err error)
9494
CommonName: fmt.Sprintf("juju-generated CA for environment %q", envName),
9595
Organization: []string{"juju"},
9696
},
97-
NotBefore: now.UTC().Add(-5 * time.Minute),
97+
NotBefore: now.UTC().AddDate(0, 0, -7),
9898
NotAfter: expiry.UTC(),
9999
SubjectKeyId: bigIntHash(key.N),
100100
KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature | x509.KeyUsageCertSign,
@@ -160,7 +160,7 @@ func newLeaf(caCertPEM, caKeyPEM string, expiry time.Time, hostnames []string, e
160160
CommonName: "*",
161161
Organization: []string{"juju"},
162162
},
163-
NotBefore: now.UTC().Add(-5 * time.Minute),
163+
NotBefore: now.UTC().AddDate(0, 0, -7),
164164
NotAfter: expiry.UTC(),
165165

166166
SubjectKeyId: bigIntHash(key.N),

cert/cert_test.go

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import (
1616
"testing"
1717
"time"
1818

19+
jc "github.com/juju/testing/checkers"
1920
gc "launchpad.net/gocheck"
2021

2122
"github.com/juju/juju/cert"
@@ -53,23 +54,29 @@ func (certSuite) TestParseCertAndKey(c *gc.C) {
5354
}
5455

5556
func (certSuite) TestNewCA(c *gc.C) {
56-
expiry := roundTime(time.Now().AddDate(0, 0, 1))
57+
now := time.Now()
58+
expiry := roundTime(now.AddDate(0, 0, 1))
5759
caCertPEM, caKeyPEM, err := cert.NewCA("foo", expiry)
5860
c.Assert(err, gc.IsNil)
5961

6062
caCert, caKey, err := cert.ParseCertAndKey(caCertPEM, caKeyPEM)
6163
c.Assert(err, gc.IsNil)
6264

63-
c.Assert(caKey, gc.FitsTypeOf, (*rsa.PrivateKey)(nil))
64-
c.Assert(caCert.Subject.CommonName, gc.Equals, `juju-generated CA for environment "foo"`)
65-
c.Assert(caCert.NotAfter.Equal(expiry), gc.Equals, true)
66-
c.Assert(caCert.BasicConstraintsValid, gc.Equals, true)
67-
c.Assert(caCert.IsCA, gc.Equals, true)
65+
c.Check(caKey, gc.FitsTypeOf, (*rsa.PrivateKey)(nil))
66+
c.Check(caCert.Subject.CommonName, gc.Equals, `juju-generated CA for environment "foo"`)
67+
// Check that the certificate is valid from one week before today.
68+
c.Check(caCert.NotBefore.Before(now), jc.IsTrue)
69+
c.Check(caCert.NotBefore.Before(now.AddDate(0, 0, -6)), jc.IsTrue)
70+
c.Check(caCert.NotBefore.After(now.AddDate(0, 0, -8)), jc.IsTrue)
71+
c.Check(caCert.NotAfter.Equal(expiry), gc.Equals, true)
72+
c.Check(caCert.BasicConstraintsValid, gc.Equals, true)
73+
c.Check(caCert.IsCA, gc.Equals, true)
6874
//c.Assert(caCert.MaxPathLen, Equals, 0) TODO it ends up as -1 - check that this is ok.
6975
}
7076

7177
func (certSuite) TestNewServer(c *gc.C) {
72-
expiry := roundTime(time.Now().AddDate(1, 0, 0))
78+
now := time.Now()
79+
expiry := roundTime(now.AddDate(1, 0, 0))
7380
caCertPEM, caKeyPEM, err := cert.NewCA("foo", expiry)
7481
c.Assert(err, gc.IsNil)
7582

@@ -83,6 +90,10 @@ func (certSuite) TestNewServer(c *gc.C) {
8390
srvCert, srvKey, err := cert.ParseCertAndKey(srvCertPEM, srvKeyPEM)
8491
c.Assert(err, gc.IsNil)
8592
c.Assert(srvCert.Subject.CommonName, gc.Equals, "*")
93+
// Check that the certificate is valid from one week before today.
94+
c.Check(srvCert.NotBefore.Before(now), jc.IsTrue)
95+
c.Check(srvCert.NotBefore.Before(now.AddDate(0, 0, -6)), jc.IsTrue)
96+
c.Check(srvCert.NotBefore.After(now.AddDate(0, 0, -8)), jc.IsTrue)
8697
c.Assert(srvCert.NotAfter.Equal(expiry), gc.Equals, true)
8798
c.Assert(srvCert.BasicConstraintsValid, gc.Equals, false)
8899
c.Assert(srvCert.IsCA, gc.Equals, false)
@@ -164,9 +175,8 @@ func (certSuite) TestVerify(c *gc.C) {
164175
err = cert.Verify(srvCert, caCert, now.Add(55*time.Second))
165176
c.Assert(err, gc.IsNil)
166177

167-
// TODO(rog) why does this succeed?
168-
// err = cert.Verify(srvCert, caCert, now.Add(-1 * time.Minute))
169-
//c.Check(err, gc.ErrorMatches, "x509: certificate has expired or is not yet valid")
178+
err = cert.Verify(srvCert, caCert, now.AddDate(0, 0, -8))
179+
c.Check(err, gc.ErrorMatches, "x509: certificate has expired or is not yet valid")
170180

171181
err = cert.Verify(srvCert, caCert, now.Add(2*time.Minute))
172182
c.Check(err, gc.ErrorMatches, "x509: certificate has expired or is not yet valid")

cloudinit/sshinit/configure.go

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,10 @@ func RunConfigureScript(script string, params ConfigureParams) error {
6262
// ConfigureScript generates the bash script that applies
6363
// the specified cloud-config.
6464
func ConfigureScript(cloudcfg *cloudinit.Config) (string, error) {
65+
if cloudcfg == nil {
66+
panic("cloudcfg is nil")
67+
}
68+
6569
// TODO(axw): 2013-08-23 bug 1215777
6670
// Carry out configuration for ssh-keys-per-user,
6771
// machine-updates-authkeys, using cloud-init config.
@@ -79,7 +83,7 @@ func ConfigureScript(cloudcfg *cloudinit.Config) (string, error) {
7983
return "", err
8084
}
8185

82-
// Add package sources and packages.
86+
// Depending on cloudcfg, potentially add package sources and packages.
8387
pkgcmds, err := addPackageCommands(cloudcfg)
8488
if err != nil {
8589
return "", err
@@ -124,6 +128,12 @@ const aptget = "apt-get --option Dpkg::Options::=--force-confold --assume-yes "
124128
// addPackageCommands returns a slice of commands that, when run,
125129
// will add the required apt repositories and packages.
126130
func addPackageCommands(cfg *cloudinit.Config) ([]string, error) {
131+
if cfg == nil {
132+
panic("cfg is nil")
133+
} else if !cfg.AptUpdate() && len(cfg.AptSources()) > 0 {
134+
return nil, fmt.Errorf("update sources were specified, but OS updates have been disabled.")
135+
}
136+
127137
// If apt_get_wrapper is specified, then prepend it to aptget.
128138
aptget := aptget
129139
wrapper := cfg.AptGetWrapper()
@@ -158,10 +168,12 @@ func addPackageCommands(cfg *cloudinit.Config) ([]string, error) {
158168
cmds = append(cmds, `printf '%s\n' `+contents+` > `+path)
159169
}
160170
}
161-
if len(cfg.AptSources()) > 0 || cfg.AptUpdate() {
171+
172+
if cfg.AptUpdate() {
162173
cmds = append(cmds, cloudinit.LogProgressCmd("Running apt-get update"))
163174
cmds = append(cmds, aptget+"update")
164175
}
176+
165177
if cfg.AptUpgrade() {
166178
cmds = append(cmds, cloudinit.LogProgressCmd("Running apt-get upgrade"))
167179
cmds = append(cmds, aptget+"upgrade")

cloudinit/sshinit/configure_test.go

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ import (
1515
envcloudinit "github.com/juju/juju/environs/cloudinit"
1616
"github.com/juju/juju/environs/config"
1717
"github.com/juju/juju/environs/imagemetadata"
18-
envtools "github.com/juju/juju/environs/tools"
1918
"github.com/juju/juju/state/api/params"
2019
coretesting "github.com/juju/juju/testing"
2120
"github.com/juju/juju/tools"
@@ -56,7 +55,7 @@ func (s *configureSuite) getCloudConfig(c *gc.C, stateServer bool, vers version.
5655
var mcfg *envcloudinit.MachineConfig
5756
var err error
5857
if stateServer {
59-
mcfg, err = environs.NewBootstrapMachineConfig(constraints.Value{}, "private-key", vers.Series)
58+
mcfg, err = environs.NewBootstrapMachineConfig(constraints.Value{}, vers.Series)
6059
c.Assert(err, gc.IsNil)
6160
mcfg.InstanceId = "instance-id"
6261
mcfg.Jobs = []params.MachineJob{params.JobManageEnviron, params.JobHostUnits}
@@ -67,7 +66,7 @@ func (s *configureSuite) getCloudConfig(c *gc.C, stateServer bool, vers version.
6766
}
6867
mcfg.Tools = &tools.Tools{
6968
Version: vers,
70-
URL: "file:///var/lib/juju/storage/" + envtools.StorageName(vers),
69+
URL: "http://testing.invalid/tools.tar.gz",
7170
}
7271
environConfig := testConfig(c, stateServer, vers)
7372
err = environs.FinishMachineConfig(mcfg, environConfig)
@@ -144,18 +143,22 @@ func assertScriptMatches(c *gc.C, cfg *cloudinit.Config, pattern string, match b
144143
}
145144

146145
func (s *configureSuite) TestAptUpdate(c *gc.C) {
147-
// apt-get update is run if either AptUpdate is set,
148-
// or apt sources are defined.
146+
// apt-get update is run only if AptUpdate is set.
149147
aptGetUpdatePattern := aptgetRegexp + "update(.|\n)*"
150148
cfg := cloudinit.New()
149+
151150
c.Assert(cfg.AptUpdate(), gc.Equals, false)
152151
c.Assert(cfg.AptSources(), gc.HasLen, 0)
153152
assertScriptMatches(c, cfg, aptGetUpdatePattern, false)
153+
154154
cfg.SetAptUpdate(true)
155155
assertScriptMatches(c, cfg, aptGetUpdatePattern, true)
156+
157+
// If we add sources, but disable updates, display an error.
156158
cfg.SetAptUpdate(false)
157159
cfg.AddAptSource("source", "key", nil)
158-
assertScriptMatches(c, cfg, aptGetUpdatePattern, true)
160+
_, err := sshinit.ConfigureScript(cfg)
161+
c.Check(err, gc.ErrorMatches, "update sources were specified, but OS updates have been disabled.")
159162
}
160163

161164
func (s *configureSuite) TestAptUpgrade(c *gc.C) {

cmd/envcmd/environmentcommand.go

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ func (c *EnvCommandBase) ConnectionCredentials() (configstore.APICredentials, er
142142
if c.envName == "" {
143143
return emptyCreds, errors.Trace(ErrNoEnvironmentSpecified)
144144
}
145-
info, err := connectionInfoForName(c.envName)
145+
info, err := ConnectionInfoForName(c.envName)
146146
if err != nil {
147147
return emptyCreds, errors.Trace(err)
148148
}
@@ -159,7 +159,7 @@ func (c *EnvCommandBase) ConnectionEndpoint(refresh bool) (configstore.APIEndpoi
159159
if c.envName == "" {
160160
return emptyEndpoint, errors.Trace(ErrNoEnvironmentSpecified)
161161
}
162-
info, err := connectionInfoForName(c.envName)
162+
info, err := ConnectionInfoForName(c.envName)
163163
if err != nil {
164164
return emptyEndpoint, errors.Trace(err)
165165
}
@@ -177,7 +177,7 @@ func (c *EnvCommandBase) ConnectionEndpoint(refresh bool) (configstore.APIEndpoi
177177
}
178178
refresher.Close()
179179

180-
info, err = connectionInfoForName(c.envName)
180+
info, err = ConnectionInfoForName(c.envName)
181181
if err != nil {
182182
return emptyEndpoint, err
183183
}
@@ -207,7 +207,9 @@ var getConfigStore = func() (configstore.Storage, error) {
207207
return store, nil
208208
}
209209

210-
func connectionInfoForName(envName string) (configstore.EnvironInfo, error) {
210+
// ConnectionInfoForName reads the environment information for the named
211+
// environment (envName) and returns it.
212+
func ConnectionInfoForName(envName string) (configstore.EnvironInfo, error) {
211213
store, err := getConfigStore()
212214
if err != nil {
213215
return nil, errors.Trace(err)
@@ -229,7 +231,7 @@ func (c *EnvCommandBase) ConnectionWriter() (ConnectionWriter, error) {
229231
if c.envName == "" {
230232
return nil, errors.Trace(ErrNoEnvironmentSpecified)
231233
}
232-
return connectionInfoForName(c.envName)
234+
return ConnectionInfoForName(c.envName)
233235
}
234236

235237
// ConnectionName returns the name of the connection if there is one.

cmd/juju/addmachine.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ import (
1414

1515
"github.com/juju/juju/cmd/envcmd"
1616
"github.com/juju/juju/constraints"
17+
"github.com/juju/juju/environs/config"
18+
"github.com/juju/juju/environs/configstore"
1719
"github.com/juju/juju/environs/manual"
1820
"github.com/juju/juju/instance"
1921
"github.com/juju/juju/state/api/params"
@@ -128,12 +130,24 @@ func (c *AddMachineCommand) Run(ctx *cmd.Context) error {
128130
defer client.Close()
129131

130132
if c.Placement != nil && c.Placement.Scope == "ssh" {
133+
134+
var config *config.Config
135+
if defaultStore, err := configstore.Default(); err != nil {
136+
return err
137+
} else if config, err = c.Config(defaultStore); err != nil {
138+
return err
139+
}
140+
131141
args := manual.ProvisionMachineArgs{
132142
Host: c.Placement.Directive,
133143
Client: client,
134144
Stdin: ctx.Stdin,
135145
Stdout: ctx.Stdout,
136146
Stderr: ctx.Stderr,
147+
UpdateBehavior: &params.UpdateBehavior{
148+
config.EnableOSRefreshUpdate(),
149+
config.EnableOSUpgrade(),
150+
},
137151
}
138152
machineId, err := manualProvisioner(args)
139153
if err == nil {

0 commit comments

Comments
 (0)