func (s *updateCloudsSuite) TestNewData(c *gc.C) { clouds, err := jujucloud.ParseCloudMetadata([]byte(sampleUpdateCloudData)) c.Assert(err, jc.ErrorIsNil) err = jujucloud.WritePublicCloudMetadata(clouds) c.Assert(err, jc.ErrorIsNil) newUpdateCloudData := sampleUpdateCloudData + ` anotherregion: endpoint: http://anotherregion/1.0 `[1:] ts := s.setupTestServer(c, newUpdateCloudData) defer ts.Close() msg := s.run(c, ts.URL, "") publicClouds, fallbackUsed, err := jujucloud.PublicCloudMetadata(jujucloud.JujuPublicCloudsPath()) c.Assert(err, jc.ErrorIsNil) c.Assert(fallbackUsed, jc.IsFalse) clouds, err = jujucloud.ParseCloudMetadata([]byte(newUpdateCloudData)) c.Assert(err, jc.ErrorIsNil) c.Assert(publicClouds, jc.DeepEquals, clouds) c.Assert(msg, gc.Matches, ` Fetching latest public cloud list... Updated your list of public clouds with 1 cloud region added: added cloud region: - aws/anotherregion `[1:]) }
func (s *updateCloudsSuite) TestNoNewData(c *gc.C) { clouds, err := jujucloud.ParseCloudMetadata([]byte(sampleUpdateCloudData)) c.Assert(err, jc.ErrorIsNil) err = jujucloud.WritePublicCloudMetadata(clouds) c.Assert(err, jc.ErrorIsNil) ts := s.setupTestServer(c, sampleUpdateCloudData) defer ts.Close() msg := s.run(c, ts.URL, "") c.Assert(strings.Replace(msg, "\n", "", -1), gc.Matches, "Fetching latest public cloud list...Your list of public clouds is up to date, see `juju clouds`.") }
func (s *updateCloudsSuite) TestNoNewData(c *gc.C) { clouds, err := jujucloud.ParseCloudMetadata([]byte(sampleUpdateCloudData)) c.Assert(err, jc.ErrorIsNil) err = jujucloud.WritePublicCloudMetadata(clouds) c.Assert(err, jc.ErrorIsNil) ts := s.setupTestServer(c, sampleUpdateCloudData) defer ts.Close() msg := s.run(c, ts.URL, "") c.Assert(msg, gc.Matches, ".*no new public cloud information available at this time.*") }
func (s *cloudSuite) TestWritePublicCloudsMetadata(c *gc.C) { clouds := map[string]cloud.Cloud{ "aws-me": cloud.Cloud{ Type: "aws", AuthTypes: []cloud.AuthType{"userpass"}, }, } err := cloud.WritePublicCloudMetadata(clouds) c.Assert(err, jc.ErrorIsNil) publicClouds, fallbackUsed, err := cloud.PublicCloudMetadata(cloud.JujuPublicCloudsPath()) c.Assert(err, jc.ErrorIsNil) c.Assert(fallbackUsed, jc.IsFalse) c.Assert(publicClouds, jc.DeepEquals, clouds) }
func (c *updateCloudsCommand) Run(ctxt *cmd.Context) error { fmt.Fprint(ctxt.Stdout, "Fetching latest public cloud list... ") client := utils.GetHTTPClient(utils.VerifySSLHostnames) resp, err := client.Get(c.publicCloudURL) if err != nil { return err } defer resp.Body.Close() noNewClouds := "\nno new public cloud information available at this time" if resp.StatusCode != http.StatusOK { switch resp.StatusCode { case http.StatusNotFound: fmt.Fprintln(ctxt.Stdout, noNewClouds) return nil case http.StatusUnauthorized: return errors.Unauthorizedf("unauthorised access to URL %q", c.publicCloudURL) } return fmt.Errorf("cannot read public cloud information at URL %q, %q", c.publicCloudURL, resp.Status) } cloudData, err := decodeCheckSignature(resp.Body, c.publicSigningKey) if err != nil { return errors.Annotate(err, "error receiving updated cloud data") } newPublicClouds, err := jujucloud.ParseCloudMetadata(cloudData) if err != nil { return errors.Annotate(err, "invalid cloud data received when updating clouds") } currentPublicClouds, _, err := jujucloud.PublicCloudMetadata(jujucloud.JujuPublicCloudsPath()) if err != nil { return errors.Annotate(err, "invalid local public cloud data") } sameCloudInfo, err := jujucloud.IsSameCloudMetadata(newPublicClouds, currentPublicClouds) if err != nil { // Should never happen. return err } if sameCloudInfo { fmt.Fprintln(ctxt.Stdout, noNewClouds) return nil } if err := jujucloud.WritePublicCloudMetadata(newPublicClouds); err != nil { return errors.Annotate(err, "error writing new local public cloud data") } fmt.Fprintln(ctxt.Stdout, "done.") return nil }
func (s *cloudSuite) TestWritePublicCloudsMetadata(c *gc.C) { origHome := osenv.SetJujuXDGDataHome(c.MkDir()) s.AddCleanup(func(*gc.C) { osenv.SetJujuXDGDataHome(origHome) }) clouds := map[string]cloud.Cloud{ "aws-me": cloud.Cloud{ Type: "aws", AuthTypes: []cloud.AuthType{"userpass"}, }, } err := cloud.WritePublicCloudMetadata(clouds) c.Assert(err, jc.ErrorIsNil) publicClouds, fallbackUsed, err := cloud.PublicCloudMetadata(cloud.JujuPublicCloudsPath()) c.Assert(err, jc.ErrorIsNil) c.Assert(fallbackUsed, jc.IsFalse) c.Assert(publicClouds, jc.DeepEquals, clouds) }
func (s *updateCloudsSuite) TestNewData(c *gc.C) { clouds, err := jujucloud.ParseCloudMetadata([]byte(sampleUpdateCloudData)) c.Assert(err, jc.ErrorIsNil) err = jujucloud.WritePublicCloudMetadata(clouds) c.Assert(err, jc.ErrorIsNil) newUpdateCloudData := sampleUpdateCloudData + ` anotherregion: endpoint: http://anotherregion/1.0 `[1:] ts := s.setupTestServer(c, newUpdateCloudData) defer ts.Close() s.run(c, ts.URL, "") publicClouds, fallbackUsed, err := jujucloud.PublicCloudMetadata(jujucloud.JujuPublicCloudsPath()) c.Assert(err, jc.ErrorIsNil) c.Assert(fallbackUsed, jc.IsFalse) clouds, err = jujucloud.ParseCloudMetadata([]byte(newUpdateCloudData)) c.Assert(err, jc.ErrorIsNil) c.Assert(publicClouds, jc.DeepEquals, clouds) }
func (s *updateCloudsSuite) TestFirstRun(c *gc.C) { // make sure there is nothing err := jujucloud.WritePublicCloudMetadata(nil) c.Assert(err, jc.ErrorIsNil) ts := s.setupTestServer(c, sampleUpdateCloudData) defer ts.Close() msg := s.run(c, ts.URL, "") publicClouds, fallbackUsed, err := jujucloud.PublicCloudMetadata(jujucloud.JujuPublicCloudsPath()) c.Assert(err, jc.ErrorIsNil) c.Assert(fallbackUsed, jc.IsFalse) clouds, err := jujucloud.ParseCloudMetadata([]byte(sampleUpdateCloudData)) c.Assert(err, jc.ErrorIsNil) c.Assert(publicClouds, jc.DeepEquals, clouds) c.Assert(msg, gc.Matches, ` Fetching latest public cloud list... Updated your list of public clouds with 1 cloud added: added cloud: - aws `[1:]) }