From 4d278369dc348c40841fb032bbc53953f89b6a7e Mon Sep 17 00:00:00 2001 From: ale8k Date: Tue, 11 Jul 2023 13:37:35 +0100 Subject: [PATCH 1/3] Quick refactor of the controller-info command --- cmd/jimmctl/cmd/controllerinfo.go | 14 +++---- cmd/jimmctl/cmd/controllerinfo_test.go | 58 +------------------------- 2 files changed, 7 insertions(+), 65 deletions(-) diff --git a/cmd/jimmctl/cmd/controllerinfo.go b/cmd/jimmctl/cmd/controllerinfo.go index f5f073432..ea40a7c92 100644 --- a/cmd/jimmctl/cmd/controllerinfo.go +++ b/cmd/jimmctl/cmd/controllerinfo.go @@ -63,16 +63,15 @@ func (c *controllerInfoCommand) Info() *cmd.Info { // SetFlags implements Command.SetFlags. func (c *controllerInfoCommand) SetFlags(f *gnuflag.FlagSet) { c.CommandBase.SetFlags(f) - f.StringVar(&c.publicAddress, "public-address", "", "The preferred controller address for public access.") } // Init implements the cmd.Command interface. func (c *controllerInfoCommand) Init(args []string) error { - if len(args) < 2 { - return errors.New("controller name or filename not specified") + if len(args) < 3 { + return errors.New("controller name, filename or public address not specified") } - c.controllerName, c.file.Path = args[0], args[1] - if len(args) > 2 { + c.controllerName, c.file.Path, c.publicAddress = args[0], args[1], args[2] + if len(args) > 3 { return errors.New("too many args") } return nil @@ -96,11 +95,8 @@ func (c *controllerInfoCommand) Run(ctxt *cmd.Context) error { } if c.publicAddress != "" { info.PublicAddress = c.publicAddress - } else if controller.PublicDNSName != "" { - info.PublicAddress = controller.PublicDNSName } else { - info.PublicAddress = controller.APIEndpoints[0] - info.CACertificate = controller.CACert + return errors.New("public address must be set") } data, err := yaml.Marshal(info) if err != nil { diff --git a/cmd/jimmctl/cmd/controllerinfo_test.go b/cmd/jimmctl/cmd/controllerinfo_test.go index 517c24305..289f72447 100644 --- a/cmd/jimmctl/cmd/controllerinfo_test.go +++ b/cmd/jimmctl/cmd/controllerinfo_test.go @@ -1,4 +1,4 @@ -// Copyright 2021 Canonical Ltd. +// Copyright 2023 Canonical Ltd. package cmd_test @@ -61,7 +61,7 @@ func (s *controllerInfoSuite) TestControllerInfo(c *gc.C) { fname := path.Join(dir, "test.yaml") - _, err = cmdtesting.RunCommand(c, cmd.NewControllerInfoCommandForTesting(store), "controller-1", fname) + _, err = cmdtesting.RunCommand(c, cmd.NewControllerInfoCommandForTesting(store), "controller-1", fname, "controller1.example.com") c.Assert(err, gc.IsNil) data, err := ioutil.ReadFile(fname) @@ -74,57 +74,3 @@ public-address: controller1.example.com username: test-user `) } - -func (s *controllerInfoSuite) TestControllerInfoSpecifiedPublicAddress(c *gc.C) { - store := s.ClientStore() - store.Controllers["controller-1"] = jujuclient.ControllerDetails{ - APIEndpoints: []string{"127.0.0.1:17070"}, - CACert: `-----BEGIN CERTIFICATE----- - MIID/jCCAmagAwIBAgIVANxsMrzsXrdpjjUoxWQm1RCkmWcqMA0GCSqGSIb3DQEB - CwUAMCYxDTALBgNVBAoTBEp1anUxFTATBgNVBAMTDGp1anUgdGVzdGluZzAeFw0y - MDA0MDgwNTI3NTBaFw0zMDA0MDgwNTMyNTBaMCYxDTALBgNVBAoTBEp1anUxFTAT - BgNVBAMTDGp1anUgdGVzdGluZzCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoC - ggGBAOW4k2bmXXU3tJ8H5AsGkp8ENLJXzU4SCOCB+X0jPQRVpFtywBVD96z+l+qW - ndGLIg5zMQTtZm71CaOw+8Sl03XU0f28Xrjf+FZCAPID1c7NBttUShbu84euFoCS - C8yobj6JzLz7QswvkshYQ7JEZ88UXtVHqg6MGYFdu+cX/dE1jC7aHg9bus/P6bFH - PVFcHVVxNbLy98Id1iB7i0s97H17nu9O7ZKMrAQAX6dfAELAFQVicdN3WpfwNXEj - M2KIrqttpM8s6/57mi9UJFYGdAEDNkJr/dI506VdGLpiqTFhQK6ztfDfY08QbWk6 - iJn8vzWvNW8WthmBtEDpv+DL+a5SJSLSAIZn9sbuBBpiX+csZb66fYhKFFIUrIa5 - lrjw8yiHJ4kgsEZJSYaAn7guqmOv8clvy1E2JjsOfGycest6+1/mNdMRFgrMxdzD - 0M2yZ96zrdfF/QXpi7Hk7jFLzimuujNUpKFv7k+XObQFxeXnoFrYVkj3YT8hhYF0 - mGRkAwIDAQABoyMwITAOBgNVHQ8BAf8EBAMCAqQwDwYDVR0TAQH/BAUwAwEB/zAN - BgkqhkiG9w0BAQsFAAOCAYEAd7GrziPRmjoK3HDF10S+5NgoKYvkOuk2jDap2Qaq - ZFjDvrDA2tr6U0FGY+Hz+QfvtgT+YpJB5IvABvSXdq37llwKGsiSOZSrpHyTsOB0 - VcZAF3GMk1nHYMr0o1xRV2gm/ax+vUEStj0k2gTs/p57uhKcCUXR0p3PWXKcRj9a - nVf5bdVkt6ghGs7/uEvj303raUFSf5dJ4C9RTgBK2E9/wlBYNyj5vcsshNpz8kt6 - RuARM6Boq2EwKkpRlbvImDM8ZJJLwtpijYrx3egfOSEA7Wfwgwn+B359XcosOee5 - n5BC62EjaP85cM9HCtp2DwKjNSosxja723qZPY6Z0Y7IVn3JVjgC2kWP6GViwb+v - l9uwx9ASHPz9ilh6gpjgIifOKZYCaBSS9g8VxHpO5Izxj4vi4AX5cebDg3SzDVik - hZuWHpuOT120okoutwuUSU9448cXLGZfoCZjjdMKXmOj8EEec1diDP4mhegYGezD - LQRNNlaY2ajLt0paowf/Xxb8 - -----END CERTIFICATE-----`, - } - store.Accounts["controller-1"] = jujuclient.AccountDetails{ - User: "test-user", - Password: "super-secret-password", - } - - dir, err := ioutil.TempDir("", "controller-info-test") - c.Assert(err, gc.Equals, nil) - defer os.RemoveAll(dir) - - fname := path.Join(dir, "test.yaml") - - _, err = cmdtesting.RunCommand(c, cmd.NewControllerInfoCommandForTesting(store), "--public-address=controller2.example.com", "controller-1", fname) - c.Assert(err, gc.IsNil) - - data, err := ioutil.ReadFile(fname) - c.Assert(err, gc.IsNil) - c.Assert(string(data), gc.Matches, `api-addresses: -- 127.0.0.1:17070 -name: controller-1 -password: super-secret-password -public-address: controller2.example.com -username: test-user -`) -} From 6b12154625fc2eef883d0cccf327001cebbcbf03 Mon Sep 17 00:00:00 2001 From: ale8k Date: Tue, 11 Jul 2023 13:54:33 +0100 Subject: [PATCH 2/3] Add --local flag --- cmd/jimmctl/cmd/controllerinfo.go | 36 ++++--- cmd/jimmctl/cmd/controllerinfo_test.go | 125 +++++++++++++++++++++++++ 2 files changed, 149 insertions(+), 12 deletions(-) diff --git a/cmd/jimmctl/cmd/controllerinfo.go b/cmd/jimmctl/cmd/controllerinfo.go index ea40a7c92..5adbe5b9c 100644 --- a/cmd/jimmctl/cmd/controllerinfo.go +++ b/cmd/jimmctl/cmd/controllerinfo.go @@ -21,13 +21,14 @@ var ( controller-info command writes controller information contained in the juju client store to a yaml file. - If a --public-address flag is specified the output controller - information will include this public address. The controller - information will also omit the ca-certrificate. + If a --local flag is specified, the output controller + public address will use the first available local API address + and the local CA cert of the controller, see examples below + for usage. - Example: - jimmctl controller-info - jimmctl controller-info --public-address=:443 + Examples: + jimmctl controller-info + jimmctl controller-info --local ` ) @@ -50,6 +51,7 @@ type controllerInfoCommand struct { controllerName string publicAddress string file cmd.FileVar + local bool } func (c *controllerInfoCommand) Info() *cmd.Info { @@ -63,14 +65,18 @@ func (c *controllerInfoCommand) Info() *cmd.Info { // SetFlags implements Command.SetFlags. func (c *controllerInfoCommand) SetFlags(f *gnuflag.FlagSet) { c.CommandBase.SetFlags(f) + f.BoolVar(&c.local, "local", false, "If local flag is specified, then the local API address and CA cert of the controller will be used.") } // Init implements the cmd.Command interface. func (c *controllerInfoCommand) Init(args []string) error { - if len(args) < 3 { - return errors.New("controller name, filename or public address not specified") + if len(args) < 2 { + return errors.New("controller name or filename not specified") + } + c.controllerName, c.file.Path = args[0], args[1] + if len(args) == 3 { + c.publicAddress = args[2] } - c.controllerName, c.file.Path, c.publicAddress = args[0], args[1], args[2] if len(args) > 3 { return errors.New("too many args") } @@ -93,11 +99,17 @@ func (c *controllerInfoCommand) Run(ctxt *cmd.Context) error { Username: account.User, Password: account.Password, } - if c.publicAddress != "" { - info.PublicAddress = c.publicAddress + if c.local { + info.PublicAddress = controller.APIEndpoints[0] + info.CACertificate = controller.CACert } else { - return errors.New("public address must be set") + if c.publicAddress != "" { + info.PublicAddress = c.publicAddress + } else { + return errors.New("public address must be set") + } } + data, err := yaml.Marshal(info) if err != nil { return errors.Mask(err) diff --git a/cmd/jimmctl/cmd/controllerinfo_test.go b/cmd/jimmctl/cmd/controllerinfo_test.go index 289f72447..86120d3ef 100644 --- a/cmd/jimmctl/cmd/controllerinfo_test.go +++ b/cmd/jimmctl/cmd/controllerinfo_test.go @@ -74,3 +74,128 @@ public-address: controller1.example.com username: test-user `) } + +func (s *controllerInfoSuite) TestControllerInfoWithLocalFlag(c *gc.C) { + store := s.ClientStore() + store.Controllers["controller-1"] = jujuclient.ControllerDetails{ + APIEndpoints: []string{"127.0.0.1:17070"}, + PublicDNSName: "controller1.example.com", + CACert: `-----BEGIN CERTIFICATE----- + MIID/jCCAmagAwIBAgIVANxsMrzsXrdpjjUoxWQm1RCkmWcqMA0GCSqGSIb3DQEB + CwUAMCYxDTALBgNVBAoTBEp1anUxFTATBgNVBAMTDGp1anUgdGVzdGluZzAeFw0y + MDA0MDgwNTI3NTBaFw0zMDA0MDgwNTMyNTBaMCYxDTALBgNVBAoTBEp1anUxFTAT + BgNVBAMTDGp1anUgdGVzdGluZzCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoC + ggGBAOW4k2bmXXU3tJ8H5AsGkp8ENLJXzU4SCOCB+X0jPQRVpFtywBVD96z+l+qW + ndGLIg5zMQTtZm71CaOw+8Sl03XU0f28Xrjf+FZCAPID1c7NBttUShbu84euFoCS + C8yobj6JzLz7QswvkshYQ7JEZ88UXtVHqg6MGYFdu+cX/dE1jC7aHg9bus/P6bFH + PVFcHVVxNbLy98Id1iB7i0s97H17nu9O7ZKMrAQAX6dfAELAFQVicdN3WpfwNXEj + M2KIrqttpM8s6/57mi9UJFYGdAEDNkJr/dI506VdGLpiqTFhQK6ztfDfY08QbWk6 + iJn8vzWvNW8WthmBtEDpv+DL+a5SJSLSAIZn9sbuBBpiX+csZb66fYhKFFIUrIa5 + lrjw8yiHJ4kgsEZJSYaAn7guqmOv8clvy1E2JjsOfGycest6+1/mNdMRFgrMxdzD + 0M2yZ96zrdfF/QXpi7Hk7jFLzimuujNUpKFv7k+XObQFxeXnoFrYVkj3YT8hhYF0 + mGRkAwIDAQABoyMwITAOBgNVHQ8BAf8EBAMCAqQwDwYDVR0TAQH/BAUwAwEB/zAN + BgkqhkiG9w0BAQsFAAOCAYEAd7GrziPRmjoK3HDF10S+5NgoKYvkOuk2jDap2Qaq + ZFjDvrDA2tr6U0FGY+Hz+QfvtgT+YpJB5IvABvSXdq37llwKGsiSOZSrpHyTsOB0 + VcZAF3GMk1nHYMr0o1xRV2gm/ax+vUEStj0k2gTs/p57uhKcCUXR0p3PWXKcRj9a + nVf5bdVkt6ghGs7/uEvj303raUFSf5dJ4C9RTgBK2E9/wlBYNyj5vcsshNpz8kt6 + RuARM6Boq2EwKkpRlbvImDM8ZJJLwtpijYrx3egfOSEA7Wfwgwn+B359XcosOee5 + n5BC62EjaP85cM9HCtp2DwKjNSosxja723qZPY6Z0Y7IVn3JVjgC2kWP6GViwb+v + l9uwx9ASHPz9ilh6gpjgIifOKZYCaBSS9g8VxHpO5Izxj4vi4AX5cebDg3SzDVik + hZuWHpuOT120okoutwuUSU9448cXLGZfoCZjjdMKXmOj8EEec1diDP4mhegYGezD + LQRNNlaY2ajLt0paowf/Xxb8 + -----END CERTIFICATE-----`, + } + store.Accounts["controller-1"] = jujuclient.AccountDetails{ + User: "test-user", + Password: "super-secret-password", + } + + dir, err := ioutil.TempDir("", "controller-info-test") + c.Assert(err, gc.Equals, nil) + defer os.RemoveAll(dir) + + fname := path.Join(dir, "test.yaml") + + _, err = cmdtesting.RunCommand(c, cmd.NewControllerInfoCommandForTesting(store), "controller-1", fname, "--local") + c.Assert(err, gc.IsNil) + + data, err := ioutil.ReadFile(fname) + c.Assert(err, gc.IsNil) + c.Assert(string(data), gc.Matches, `api-addresses: +- 127.0.0.1:17070 +ca-certificate: |- + -----BEGIN CERTIFICATE----- + MIID/jCCAmagAwIBAgIVANxsMrzsXrdpjjUoxWQm1RCkmWcqMA0GCSqGSIb3DQEB + CwUAMCYxDTALBgNVBAoTBEp1anUxFTATBgNVBAMTDGp1anUgdGVzdGluZzAeFw0y + MDA0MDgwNTI3NTBaFw0zMDA0MDgwNTMyNTBaMCYxDTALBgNVBAoTBEp1anUxFTAT + BgNVBAMTDGp1anUgdGVzdGluZzCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoC + ggGBAOW4k2bmXXU3tJ8H5AsGkp8ENLJXzU4SCOCB+X0jPQRVpFtywBVD96z+l+qW + ndGLIg5zMQTtZm71CaOw+8Sl03XU0f28Xrjf+FZCAPID1c7NBttUShbu84euFoCS + C8yobj6JzLz7QswvkshYQ7JEZ88UXtVHqg6MGYFdu+cX/dE1jC7aHg9bus/P6bFH + PVFcHVVxNbLy98Id1iB7i0s97H17nu9O7ZKMrAQAX6dfAELAFQVicdN3WpfwNXEj + M2KIrqttpM8s6/57mi9UJFYGdAEDNkJr/dI506VdGLpiqTFhQK6ztfDfY08QbWk6 + iJn8vzWvNW8WthmBtEDpv+DL+a5SJSLSAIZn9sbuBBpiX+csZb66fYhKFFIUrIa5 + lrjw8yiHJ4kgsEZJSYaAn7guqmOv8clvy1E2JjsOfGycest6+1/mNdMRFgrMxdzD + 0M2yZ96zrdfF/QXpi7Hk7jFLzimuujNUpKFv7k+XObQFxeXnoFrYVkj3YT8hhYF0 + mGRkAwIDAQABoyMwITAOBgNVHQ8BAf8EBAMCAqQwDwYDVR0TAQH/BAUwAwEB/zAN + BgkqhkiG9w0BAQsFAAOCAYEAd7GrziPRmjoK3HDF10S+5NgoKYvkOuk2jDap2Qaq + ZFjDvrDA2tr6U0FGY+Hz+QfvtgT+YpJB5IvABvSXdq37llwKGsiSOZSrpHyTsOB0 + VcZAF3GMk1nHYMr0o1xRV2gm/ax+vUEStj0k2gTs/p57uhKcCUXR0p3PWXKcRj9a + nVf5bdVkt6ghGs7/uEvj303raUFSf5dJ4C9RTgBK2E9/wlBYNyj5vcsshNpz8kt6 + RuARM6Boq2EwKkpRlbvImDM8ZJJLwtpijYrx3egfOSEA7Wfwgwn+B359XcosOee5 + n5BC62EjaP85cM9HCtp2DwKjNSosxja723qZPY6Z0Y7IVn3JVjgC2kWP6GViwb+v + l9uwx9ASHPz9ilh6gpjgIifOKZYCaBSS9g8VxHpO5Izxj4vi4AX5cebDg3SzDVik + hZuWHpuOT120okoutwuUSU9448cXLGZfoCZjjdMKXmOj8EEec1diDP4mhegYGezD + LQRNNlaY2ajLt0paowf/Xxb8 + -----END CERTIFICATE----- +name: controller-1 +password: super-secret-password +public-address: 127.0.0.1:17070 +username: test-user +`) +} + +func (s *controllerInfoSuite) TestControllerInfoMissingPublicAddressAndNoLocalFlag(c *gc.C) { + store := s.ClientStore() + store.Controllers["controller-1"] = jujuclient.ControllerDetails{ + APIEndpoints: []string{"127.0.0.1:17070"}, + PublicDNSName: "controller1.example.com", + CACert: `-----BEGIN CERTIFICATE----- + MIID/jCCAmagAwIBAgIVANxsMrzsXrdpjjUoxWQm1RCkmWcqMA0GCSqGSIb3DQEB + CwUAMCYxDTALBgNVBAoTBEp1anUxFTATBgNVBAMTDGp1anUgdGVzdGluZzAeFw0y + MDA0MDgwNTI3NTBaFw0zMDA0MDgwNTMyNTBaMCYxDTALBgNVBAoTBEp1anUxFTAT + BgNVBAMTDGp1anUgdGVzdGluZzCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoC + ggGBAOW4k2bmXXU3tJ8H5AsGkp8ENLJXzU4SCOCB+X0jPQRVpFtywBVD96z+l+qW + ndGLIg5zMQTtZm71CaOw+8Sl03XU0f28Xrjf+FZCAPID1c7NBttUShbu84euFoCS + C8yobj6JzLz7QswvkshYQ7JEZ88UXtVHqg6MGYFdu+cX/dE1jC7aHg9bus/P6bFH + PVFcHVVxNbLy98Id1iB7i0s97H17nu9O7ZKMrAQAX6dfAELAFQVicdN3WpfwNXEj + M2KIrqttpM8s6/57mi9UJFYGdAEDNkJr/dI506VdGLpiqTFhQK6ztfDfY08QbWk6 + iJn8vzWvNW8WthmBtEDpv+DL+a5SJSLSAIZn9sbuBBpiX+csZb66fYhKFFIUrIa5 + lrjw8yiHJ4kgsEZJSYaAn7guqmOv8clvy1E2JjsOfGycest6+1/mNdMRFgrMxdzD + 0M2yZ96zrdfF/QXpi7Hk7jFLzimuujNUpKFv7k+XObQFxeXnoFrYVkj3YT8hhYF0 + mGRkAwIDAQABoyMwITAOBgNVHQ8BAf8EBAMCAqQwDwYDVR0TAQH/BAUwAwEB/zAN + BgkqhkiG9w0BAQsFAAOCAYEAd7GrziPRmjoK3HDF10S+5NgoKYvkOuk2jDap2Qaq + ZFjDvrDA2tr6U0FGY+Hz+QfvtgT+YpJB5IvABvSXdq37llwKGsiSOZSrpHyTsOB0 + VcZAF3GMk1nHYMr0o1xRV2gm/ax+vUEStj0k2gTs/p57uhKcCUXR0p3PWXKcRj9a + nVf5bdVkt6ghGs7/uEvj303raUFSf5dJ4C9RTgBK2E9/wlBYNyj5vcsshNpz8kt6 + RuARM6Boq2EwKkpRlbvImDM8ZJJLwtpijYrx3egfOSEA7Wfwgwn+B359XcosOee5 + n5BC62EjaP85cM9HCtp2DwKjNSosxja723qZPY6Z0Y7IVn3JVjgC2kWP6GViwb+v + l9uwx9ASHPz9ilh6gpjgIifOKZYCaBSS9g8VxHpO5Izxj4vi4AX5cebDg3SzDVik + hZuWHpuOT120okoutwuUSU9448cXLGZfoCZjjdMKXmOj8EEec1diDP4mhegYGezD + LQRNNlaY2ajLt0paowf/Xxb8 + -----END CERTIFICATE-----`, + } + store.Accounts["controller-1"] = jujuclient.AccountDetails{ + User: "test-user", + Password: "super-secret-password", + } + + dir, err := ioutil.TempDir("", "controller-info-test") + c.Assert(err, gc.Equals, nil) + defer os.RemoveAll(dir) + + fname := path.Join(dir, "test.yaml") + + _, err = cmdtesting.RunCommand(c, cmd.NewControllerInfoCommandForTesting(store), "controller-1", fname) + c.Assert(err, gc.ErrorMatches, "public address must be set") +} From 30488ff7c4a41a4fa8d2ac9bf2207deffc1e111a Mon Sep 17 00:00:00 2001 From: ale8k Date: Wed, 12 Jul 2023 10:14:37 +0100 Subject: [PATCH 3/3] Prevent addr and --local --- cmd/jimmctl/cmd/controllerinfo.go | 14 ++++---- cmd/jimmctl/cmd/controllerinfo_test.go | 45 ++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 6 deletions(-) diff --git a/cmd/jimmctl/cmd/controllerinfo.go b/cmd/jimmctl/cmd/controllerinfo.go index 5adbe5b9c..706643155 100644 --- a/cmd/jimmctl/cmd/controllerinfo.go +++ b/cmd/jimmctl/cmd/controllerinfo.go @@ -99,15 +99,17 @@ func (c *controllerInfoCommand) Run(ctxt *cmd.Context) error { Username: account.User, Password: account.Password, } + + info.PublicAddress = c.publicAddress if c.local { info.PublicAddress = controller.APIEndpoints[0] info.CACertificate = controller.CACert - } else { - if c.publicAddress != "" { - info.PublicAddress = c.publicAddress - } else { - return errors.New("public address must be set") - } + } + if info.PublicAddress == "" { + return errors.New("public address must be set") + } + if c.local && len(c.publicAddress) > 0 { + return errors.New("please do not set both the address argument and the local flag") } data, err := yaml.Marshal(info) diff --git a/cmd/jimmctl/cmd/controllerinfo_test.go b/cmd/jimmctl/cmd/controllerinfo_test.go index 86120d3ef..f9c03744f 100644 --- a/cmd/jimmctl/cmd/controllerinfo_test.go +++ b/cmd/jimmctl/cmd/controllerinfo_test.go @@ -199,3 +199,48 @@ func (s *controllerInfoSuite) TestControllerInfoMissingPublicAddressAndNoLocalFl _, err = cmdtesting.RunCommand(c, cmd.NewControllerInfoCommandForTesting(store), "controller-1", fname) c.Assert(err, gc.ErrorMatches, "public address must be set") } + +func (s *controllerInfoSuite) TestControllerInfoCannotProvideAddrAndLocalFlag(c *gc.C) { + store := s.ClientStore() + store.Controllers["controller-1"] = jujuclient.ControllerDetails{ + APIEndpoints: []string{"127.0.0.1:17070"}, + PublicDNSName: "controller1.example.com", + CACert: `-----BEGIN CERTIFICATE----- + MIID/jCCAmagAwIBAgIVANxsMrzsXrdpjjUoxWQm1RCkmWcqMA0GCSqGSIb3DQEB + CwUAMCYxDTALBgNVBAoTBEp1anUxFTATBgNVBAMTDGp1anUgdGVzdGluZzAeFw0y + MDA0MDgwNTI3NTBaFw0zMDA0MDgwNTMyNTBaMCYxDTALBgNVBAoTBEp1anUxFTAT + BgNVBAMTDGp1anUgdGVzdGluZzCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoC + ggGBAOW4k2bmXXU3tJ8H5AsGkp8ENLJXzU4SCOCB+X0jPQRVpFtywBVD96z+l+qW + ndGLIg5zMQTtZm71CaOw+8Sl03XU0f28Xrjf+FZCAPID1c7NBttUShbu84euFoCS + C8yobj6JzLz7QswvkshYQ7JEZ88UXtVHqg6MGYFdu+cX/dE1jC7aHg9bus/P6bFH + PVFcHVVxNbLy98Id1iB7i0s97H17nu9O7ZKMrAQAX6dfAELAFQVicdN3WpfwNXEj + M2KIrqttpM8s6/57mi9UJFYGdAEDNkJr/dI506VdGLpiqTFhQK6ztfDfY08QbWk6 + iJn8vzWvNW8WthmBtEDpv+DL+a5SJSLSAIZn9sbuBBpiX+csZb66fYhKFFIUrIa5 + lrjw8yiHJ4kgsEZJSYaAn7guqmOv8clvy1E2JjsOfGycest6+1/mNdMRFgrMxdzD + 0M2yZ96zrdfF/QXpi7Hk7jFLzimuujNUpKFv7k+XObQFxeXnoFrYVkj3YT8hhYF0 + mGRkAwIDAQABoyMwITAOBgNVHQ8BAf8EBAMCAqQwDwYDVR0TAQH/BAUwAwEB/zAN + BgkqhkiG9w0BAQsFAAOCAYEAd7GrziPRmjoK3HDF10S+5NgoKYvkOuk2jDap2Qaq + ZFjDvrDA2tr6U0FGY+Hz+QfvtgT+YpJB5IvABvSXdq37llwKGsiSOZSrpHyTsOB0 + VcZAF3GMk1nHYMr0o1xRV2gm/ax+vUEStj0k2gTs/p57uhKcCUXR0p3PWXKcRj9a + nVf5bdVkt6ghGs7/uEvj303raUFSf5dJ4C9RTgBK2E9/wlBYNyj5vcsshNpz8kt6 + RuARM6Boq2EwKkpRlbvImDM8ZJJLwtpijYrx3egfOSEA7Wfwgwn+B359XcosOee5 + n5BC62EjaP85cM9HCtp2DwKjNSosxja723qZPY6Z0Y7IVn3JVjgC2kWP6GViwb+v + l9uwx9ASHPz9ilh6gpjgIifOKZYCaBSS9g8VxHpO5Izxj4vi4AX5cebDg3SzDVik + hZuWHpuOT120okoutwuUSU9448cXLGZfoCZjjdMKXmOj8EEec1diDP4mhegYGezD + LQRNNlaY2ajLt0paowf/Xxb8 + -----END CERTIFICATE-----`, + } + store.Accounts["controller-1"] = jujuclient.AccountDetails{ + User: "test-user", + Password: "super-secret-password", + } + + dir, err := ioutil.TempDir("", "controller-info-test") + c.Assert(err, gc.Equals, nil) + defer os.RemoveAll(dir) + + fname := path.Join(dir, "test.yaml") + + _, err = cmdtesting.RunCommand(c, cmd.NewControllerInfoCommandForTesting(store), "controller-1", fname, "myaddress", "--local") + c.Assert(err, gc.ErrorMatches, "please do not set both the address argument and the local flag") +}