func cloudChanged(cloudName string, new, old jujucloud.Cloud) bool { same, _ := jujucloud.IsSameCloudMetadata( map[string]jujucloud.Cloud{cloudName: new}, map[string]jujucloud.Cloud{cloudName: old}, ) // If both old and new version are the same the cloud is not changed. return !same }
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) assertCompareClouds(c *gc.C, meta2 string, expected bool) { meta1 := ` clouds: aws-me: type: aws auth-types: [ userpass ] `[1:] if meta2 == "" { meta2 = meta1 } c1, err := cloud.ParseCloudMetadata([]byte(meta1)) c.Assert(err, jc.ErrorIsNil) c2, err := cloud.ParseCloudMetadata([]byte(meta2)) c.Assert(err, jc.ErrorIsNil) result, err := cloud.IsSameCloudMetadata(c1, c2) c.Assert(err, jc.ErrorIsNil) c.Assert(result, gc.Equals, expected) }