Make sure all the agents have the environment uuid in agent config. #1417

Merged
merged 5 commits into from Jan 19, 2015
View
@@ -139,6 +139,10 @@ type Config interface {
// PreferIPv6 returns whether to prefer using IPv6 addresses (if
// available) when connecting to the state or API server.
PreferIPv6() bool
+
+ // Environment returns the tag for the environment that the agent belongs
+ // to.
+ Environment() names.EnvironTag
}
type ConfigSetterOnly interface {
@@ -212,6 +216,7 @@ type MigrateParams struct {
Jobs []multiwatcher.MachineJob
DeleteValues []string
Values map[string]string
+ Environment names.EnvironTag
}
// Ensure that the configInternal struct implements the Config interface.
@@ -237,6 +242,7 @@ type configInternal struct {
logDir string
tag names.Tag
nonce string
+ environment names.EnvironTag
jobs []multiwatcher.MachineJob
upgradedToVersion version.Number
caCert string
@@ -256,6 +262,7 @@ type AgentConfigParams struct {
Tag names.Tag
Password string
Nonce string
+ Environment names.EnvironTag
StateAddresses []string
APIAddresses []string
CACert string
@@ -288,6 +295,11 @@ func NewAgentConfig(configParams AgentConfigParams) (ConfigSetterWriter, error)
if configParams.Password == "" {
return nil, errors.Trace(requiredError("password"))
}
+ if uuid := configParams.Environment.Id(); uuid == "" {
+ return nil, errors.Trace(requiredError("environment"))
+ } else if !names.IsValidEnvironment(uuid) {
+ return nil, errors.Errorf("%q is not a valid environment uuid", uuid)
+ }
if len(configParams.CACert) == 0 {
return nil, errors.Trace(requiredError("CA certificate"))
}
@@ -300,6 +312,7 @@ func NewAgentConfig(configParams AgentConfigParams) (ConfigSetterWriter, error)
upgradedToVersion: configParams.UpgradedToVersion,
tag: configParams.Tag,
nonce: configParams.Nonce,
+ environment: configParams.Environment,
caCert: configParams.CACert,
oldPassword: configParams.Password,
values: configParams.Values,
@@ -454,6 +467,9 @@ func (config *configInternal) Migrate(newParams MigrateParams) error {
}
config.values[key] = value
}
+ if newParams.Environment.Id() != "" {
+ config.environment = newParams.Environment
+ }
if err := config.check(); err != nil {
return fmt.Errorf("migrated agent config is invalid: %v", err)
}
@@ -582,6 +598,10 @@ func (c *configInternal) Tag() names.Tag {
return c.tag
}
+func (c *configInternal) Environment() names.EnvironTag {
+ return c.environment
+}
+
func (c *configInternal) Dir() string {
return Dir(c.dataDir, c.tag)
}
@@ -663,11 +683,12 @@ func (c *configInternal) APIInfo() *api.Info {
}
}
return &api.Info{
- Addrs: addrs,
- Password: c.apiDetails.password,
- CACert: c.caCert,
- Tag: c.tag,
- Nonce: c.nonce,
+ Addrs: addrs,
+ Password: c.apiDetails.password,
+ CACert: c.caCert,
+ Tag: c.tag,
+ Nonce: c.nonce,
+ EnvironTag: c.environment,
}
}
View
@@ -58,13 +58,33 @@ var agentConfigTests = []struct {
UpgradedToVersion: version.Current.Number,
},
checkErr: "password not found in configuration",
+}, {
+ about: "missing environment tag",
+ params: agent.AgentConfigParams{
+ DataDir: "/data/dir",
+ Tag: names.NewMachineTag("1"),
+ UpgradedToVersion: version.Current.Number,
+ Password: "sekrit",
+ },
+ checkErr: "environment not found in configuration",
+}, {
+ about: "invalid environment tag",
+ params: agent.AgentConfigParams{
+ DataDir: "/data/dir",
+ Tag: names.NewMachineTag("1"),
+ UpgradedToVersion: version.Current.Number,
+ Password: "sekrit",
+ Environment: names.NewEnvironTag("uuid"),
+ },
+ checkErr: `"uuid" is not a valid environment uuid`,
}, {
about: "missing CA cert",
params: agent.AgentConfigParams{
DataDir: "/data/dir",
Tag: names.NewMachineTag("1"),
UpgradedToVersion: version.Current.Number,
Password: "sekrit",
+ Environment: testing.EnvironmentTag,
},
checkErr: "CA certificate not found in configuration",
}, {
@@ -75,6 +95,7 @@ var agentConfigTests = []struct {
UpgradedToVersion: version.Current.Number,
Password: "sekrit",
CACert: "ca cert",
+ Environment: testing.EnvironmentTag,
},
checkErr: "state or API addresses not found in configuration",
}, {
@@ -85,6 +106,7 @@ var agentConfigTests = []struct {
UpgradedToVersion: version.Current.Number,
Password: "sekrit",
CACert: "ca cert",
+ Environment: testing.EnvironmentTag,
StateAddresses: []string{"localhost:8080", "bad-address"},
},
checkErr: `invalid state server address "bad-address"`,
@@ -96,6 +118,7 @@ var agentConfigTests = []struct {
UpgradedToVersion: version.Current.Number,
Password: "sekrit",
CACert: "ca cert",
+ Environment: testing.EnvironmentTag,
APIAddresses: []string{"localhost:8080", "bad-address"},
},
checkErr: `invalid API server address "bad-address"`,
@@ -107,6 +130,7 @@ var agentConfigTests = []struct {
UpgradedToVersion: version.Current.Number,
Password: "sekrit",
CACert: "ca cert",
+ Environment: testing.EnvironmentTag,
StateAddresses: []string{"localhost:1234"},
},
}, {
@@ -117,6 +141,7 @@ var agentConfigTests = []struct {
UpgradedToVersion: version.Current.Number,
Password: "sekrit",
CACert: "ca cert",
+ Environment: testing.EnvironmentTag,
APIAddresses: []string{"localhost:1234"},
},
}, {
@@ -127,6 +152,7 @@ var agentConfigTests = []struct {
UpgradedToVersion: version.Current.Number,
Password: "sekrit",
CACert: "ca cert",
+ Environment: testing.EnvironmentTag,
StateAddresses: []string{"localhost:1234"},
APIAddresses: []string{"localhost:1235"},
},
@@ -138,6 +164,7 @@ var agentConfigTests = []struct {
Password: "sekrit",
UpgradedToVersion: version.Current.Number,
CACert: "ca cert",
+ Environment: testing.EnvironmentTag,
StateAddresses: []string{"localhost:1234"},
APIAddresses: []string{"localhost:1235"},
Nonce: "a nonce",
@@ -150,6 +177,7 @@ var agentConfigTests = []struct {
Password: "sekrit",
UpgradedToVersion: version.Current.Number,
CACert: "ca cert",
+ Environment: testing.EnvironmentTag,
StateAddresses: []string{"localhost:1234"},
APIAddresses: []string{"localhost:1235"},
Nonce: "a nonce",
@@ -173,6 +201,7 @@ var agentConfigTests = []struct {
Tag: names.NewUnitTag("ubuntu/1"),
Password: "sekrit",
UpgradedToVersion: version.Current.Number,
+ Environment: testing.EnvironmentTag,
CACert: "ca cert",
StateAddresses: []string{"localhost:1234"},
APIAddresses: []string{"localhost:1235"},
@@ -188,6 +217,7 @@ var agentConfigTests = []struct {
Password: "sekrit",
UpgradedToVersion: version.Current.Number,
CACert: "ca cert",
+ Environment: testing.EnvironmentTag,
StateAddresses: []string{"localhost:1234"},
APIAddresses: []string{"localhost:1235"},
Nonce: "a nonce",
@@ -204,6 +234,7 @@ var agentConfigTests = []struct {
Password: "sekrit",
UpgradedToVersion: version.Current.Number,
CACert: "ca cert",
+ Environment: testing.EnvironmentTag,
StateAddresses: []string{"localhost:1234"},
APIAddresses: []string{"localhost:1235"},
Nonce: "a nonce",
@@ -241,6 +272,7 @@ func (*suite) TestMigrate(c *gc.C) {
multiwatcher.JobHostUnits,
},
CACert: "ca cert",
+ Environment: testing.EnvironmentTag,
StateAddresses: []string{"localhost:1234"},
APIAddresses: []string{"localhost:4321"},
Values: map[string]string{
@@ -438,6 +470,7 @@ var attributeParams = agent.AgentConfigParams{
StateAddresses: []string{"localhost:1234"},
APIAddresses: []string{"localhost:1235"},
Nonce: "a nonce",
+ Environment: testing.EnvironmentTag,
}
func (*suite) TestAttributes(c *gc.C) {
@@ -589,11 +622,12 @@ func (*suite) TestSetPassword(c *gc.C) {
c.Assert(err, jc.ErrorIsNil)
expectAPIInfo := &api.Info{
- Addrs: attrParams.APIAddresses,
- CACert: attrParams.CACert,
- Tag: attrParams.Tag,
- Password: "",
- Nonce: attrParams.Nonce,
+ Addrs: attrParams.APIAddresses,
+ CACert: attrParams.CACert,
+ Tag: attrParams.Tag,
+ Password: "",
+ Nonce: attrParams.Nonce,
+ EnvironTag: attrParams.Environment,
}
c.Assert(conf.APIInfo(), jc.DeepEquals, expectAPIInfo)
addr := fmt.Sprintf("127.0.0.1:%d", servingInfo.StatePort)
@@ -57,6 +57,7 @@ func (s *bootstrapSuite) TestInitializeState(c *gc.C) {
StateAddresses: []string{s.mgoInst.Addr()},
CACert: testing.CACert,
Password: pwHash,
+ Environment: testing.EnvironmentTag,
}
servingInfo := params.StateServingInfo{
Cert: testing.ServerCert,
@@ -174,6 +175,7 @@ func (s *bootstrapSuite) TestInitializeStateWithStateServingInfoNotAvailable(c *
StateAddresses: []string{s.mgoInst.Addr()},
CACert: testing.CACert,
Password: "fake",
+ Environment: testing.EnvironmentTag,
}
cfg, err := agent.NewAgentConfig(configParams)
c.Assert(err, jc.ErrorIsNil)
@@ -198,6 +200,7 @@ func (s *bootstrapSuite) TestInitializeStateFailsSecondTime(c *gc.C) {
StateAddresses: []string{s.mgoInst.Addr()},
CACert: testing.CACert,
Password: pwHash,
+ Environment: testing.EnvironmentTag,
}
cfg, err := agent.NewAgentConfig(configParams)
c.Assert(err, jc.ErrorIsNil)
View
@@ -8,6 +8,7 @@ import (
"net"
"strconv"
+ "github.com/juju/errors"
"github.com/juju/names"
goyaml "gopkg.in/yaml.v1"
@@ -38,6 +39,7 @@ type format_1_18Serialization struct {
StateAddresses []string `yaml:",omitempty"`
StatePassword string `yaml:",omitempty"`
+ Environment string `yaml:",omitempty"`
APIAddresses []string `yaml:",omitempty"`
APIPassword string `yaml:",omitempty"`
@@ -80,13 +82,21 @@ func (formatter_1_18) unmarshal(data []byte) (*configInternal, error) {
if err != nil {
return nil, err
}
+ var envTag names.EnvironTag
+ if format.Environment != "" {
+ envTag, err = names.ParseEnvironTag(format.Environment)
+ if err != nil {
+ return nil, errors.Trace(err)
+ }
+ }
config := &configInternal{
tag: tag,
dataDir: format.DataDir,
logDir: format.LogDir,
jobs: format.Jobs,
upgradedToVersion: *format.UpgradedToVersion,
nonce: format.Nonce,
+ environment: envTag,
caCert: format.CACert,
oldPassword: format.OldPassword,
values: format.Values,
@@ -144,13 +154,18 @@ func (formatter_1_18) unmarshal(data []byte) (*configInternal, error) {
}
func (formatter_1_18) marshal(config *configInternal) ([]byte, error) {
+ var envTag string
+ if config.environment.Id() != "" {
+ envTag = config.environment.String()
+ }
format := &format_1_18Serialization{
Tag: config.tag.String(),
DataDir: config.dataDir,
LogDir: config.logDir,
Jobs: config.jobs,
UpgradedToVersion: &config.upgradedToVersion,
Nonce: config.nonce,
+ Environment: envTag,
CACert: string(config.caCert),
OldPassword: config.oldPassword,
Values: config.values,
@@ -51,6 +51,8 @@ func (s *format_1_18Suite) TestMissingAttributes(c *gc.C) {
c.Assert(configLogDir, gc.Equals, logPath)
c.Assert(configDataDir, gc.Equals, realDataDir)
c.Assert(readConfig.PreferIPv6(), jc.IsFalse)
+ // The api info doesn't have the environment tag set.
+ c.Assert(readConfig.APIInfo().EnvironTag.Id(), gc.Equals, "")
}
func (s *format_1_18Suite) TestStatePortNotParsedWithoutSecret(c *gc.C) {
@@ -37,6 +37,7 @@ var agentParams = AgentConfigParams{
APIAddresses: []string{"localhost:1235"},
Nonce: "a nonce",
PreferIPv6: false,
+ Environment: testing.EnvironmentTag,
}
func newTestConfig(c *gc.C) *configInternal {
View
@@ -34,6 +34,7 @@ var attributeParams = AgentConfigParams{
StateAddresses: []string{"localhost:1234"},
APIAddresses: []string{"localhost:1235"},
Nonce: "a nonce",
+ Environment: testing.EnvironmentTag,
}
var servingInfo = params.StateServingInfo{
@@ -38,6 +38,17 @@ func (a *APIAddresser) APIAddresses() ([]string, error) {
return result.Result, nil
}
+// EnvironUUID returns the environment UUID to connect to the environment
+// that the current connection is for.
+func (a *APIAddresser) EnvironUUID() (string, error) {
+ var result params.StringResult
+ err := a.facade.FacadeCall("EnvironUUID", nil, &result)
+ if err != nil {
+ return "", err
+ }
+ return result.Result, nil
+}
+
// CACert returns the certificate used to validate the API and state connections.
func (a *APIAddresser) CACert() (string, error) {
var result params.BytesResult
@@ -104,7 +104,8 @@ func (s *machineUpgraderSuite) TestTools(c *gc.C) {
stateTools, err := s.st.Tools(s.rawMachine.Tag().String())
c.Assert(err, jc.ErrorIsNil)
c.Assert(stateTools.Version, gc.Equals, cur)
- url := fmt.Sprintf("https://%s/environment/90168e4c-2f10-4e9c-83c2-feedfacee5a9/tools/%s", s.stateAPI.Addr(), cur)
+ url := fmt.Sprintf("https://%s/environment/%s/tools/%s",
+ s.stateAPI.Addr(), coretesting.EnvironmentTag.Id(), cur)
c.Assert(stateTools.URL, gc.Equals, url)
}
@@ -2657,7 +2657,8 @@ func (s *clientSuite) TestClientFindTools(c *gc.C) {
c.Assert(result.Error, gc.IsNil)
c.Assert(result.List, gc.HasLen, 1)
c.Assert(result.List[0].Version, gc.Equals, version.MustParseBinary("2.12.0-precise-amd64"))
- url := fmt.Sprintf("https://%s/environment/90168e4c-2f10-4e9c-83c2-feedfacee5a9/tools/%s", s.APIState.Addr(), result.List[0].Version)
+ url := fmt.Sprintf("https://%s/environment/%s/tools/%s",
+ s.APIState.Addr(), coretesting.EnvironmentTag.Id(), result.List[0].Version)
c.Assert(result.List[0].URL, gc.Equals, url)
}
Oops, something went wrong.