func (s *UpgradeCharmResourceSuite) TestUpgradeWithResources(c *gc.C) { myriakPath := testcharms.Repo.ClonedDir(c.MkDir(), "riak") err := ioutil.WriteFile(path.Join(myriakPath.Path, "metadata.yaml"), riakResourceMeta, 0644) c.Assert(err, jc.ErrorIsNil) data := []byte("some-data") fp, err := charmresource.GenerateFingerprint(bytes.NewReader(data)) c.Assert(err, jc.ErrorIsNil) resourceFile := path.Join(c.MkDir(), "data.lib") err = ioutil.WriteFile(resourceFile, data, 0644) c.Assert(err, jc.ErrorIsNil) _, err = testing.RunCommand(c, application.NewUpgradeCharmCommand(), "riak", "--path="+myriakPath.Path, "--resource", "data="+resourceFile) c.Assert(err, jc.ErrorIsNil) resources, err := s.State.Resources() c.Assert(err, jc.ErrorIsNil) sr, err := resources.ListResources("riak") c.Assert(err, jc.ErrorIsNil) c.Check(sr.Resources, gc.HasLen, 1) c.Check(sr.Resources[0].ApplicationID, gc.Equals, "riak") // Most of this is just a sanity check... this is all tested elsewhere. c.Check(sr.Resources[0].PendingID, gc.Equals, "") c.Check(sr.Resources[0].Username, gc.Not(gc.Equals), "") c.Check(sr.Resources[0].ID, gc.Not(gc.Equals), "") c.Check(sr.Resources[0].Timestamp.IsZero(), jc.IsFalse) // Ensure we get the data we passed in from the metadata.yaml. c.Check(sr.Resources[0].Resource, gc.DeepEquals, charmresource.Resource{ Meta: charmresource.Meta{ Name: "data", Type: charmresource.TypeFile, Path: "foo.lib", Description: "some comment", }, Origin: charmresource.OriginUpload, Fingerprint: fp, Size: int64(len(data)), }) }
// registerCommands registers commands in the specified registry. func registerCommands(r commandRegistry, ctx *cmd.Context) { // Creation commands. r.Register(newBootstrapCommand()) r.Register(application.NewAddRelationCommand()) // Destruction commands. r.Register(application.NewRemoveRelationCommand()) r.Register(application.NewRemoveServiceCommand()) r.Register(application.NewRemoveUnitCommand()) // Reporting commands. r.Register(status.NewStatusCommand()) r.Register(newSwitchCommand()) r.Register(status.NewStatusHistoryCommand()) // Error resolution and debugging commands. r.Register(newRunCommand()) r.Register(newSCPCommand()) r.Register(newSSHCommand()) r.Register(newResolvedCommand()) r.Register(newDebugLogCommand()) r.Register(newDebugHooksCommand()) // Configuration commands. r.Register(model.NewModelGetConstraintsCommand()) r.Register(model.NewModelSetConstraintsCommand()) r.Register(newSyncToolsCommand()) r.Register(newUpgradeJujuCommand(nil)) r.Register(application.NewUpgradeCharmCommand()) // Charm tool commands. r.Register(newHelpToolCommand()) r.Register(charmcmd.NewSuperCommand()) // Manage backups. r.Register(backups.NewCreateCommand()) r.Register(backups.NewDownloadCommand()) r.Register(backups.NewShowCommand()) r.Register(backups.NewListCommand()) r.Register(backups.NewRemoveCommand()) r.Register(backups.NewRestoreCommand()) r.Register(backups.NewUploadCommand()) // Manage authorized ssh keys. r.Register(NewAddKeysCommand()) r.Register(NewRemoveKeysCommand()) r.Register(NewImportKeysCommand()) r.Register(NewListKeysCommand()) // Manage users and access r.Register(user.NewAddCommand()) r.Register(user.NewChangePasswordCommand()) r.Register(user.NewShowUserCommand()) r.Register(user.NewListCommand()) r.Register(user.NewEnableCommand()) r.Register(user.NewDisableCommand()) r.Register(user.NewLoginCommand()) r.Register(user.NewLogoutCommand()) r.Register(user.NewRemoveCommand()) r.Register(user.NewWhoAmICommand()) // Manage cached images r.Register(cachedimages.NewRemoveCommand()) r.Register(cachedimages.NewListCommand()) // Manage machines r.Register(machine.NewAddCommand()) r.Register(machine.NewRemoveCommand()) r.Register(machine.NewListMachinesCommand()) r.Register(machine.NewShowMachineCommand()) // Manage model r.Register(model.NewConfigCommand()) r.Register(model.NewDefaultsCommand()) r.Register(model.NewRetryProvisioningCommand()) r.Register(model.NewDestroyCommand()) r.Register(model.NewGrantCommand()) r.Register(model.NewRevokeCommand()) r.Register(model.NewShowCommand()) if featureflag.Enabled(feature.Migration) { r.Register(newMigrateCommand()) } if featureflag.Enabled(feature.DeveloperMode) { r.Register(model.NewDumpCommand()) r.Register(model.NewDumpDBCommand()) } // Manage and control actions r.Register(action.NewStatusCommand()) r.Register(action.NewRunCommand()) r.Register(action.NewShowOutputCommand()) r.Register(action.NewListCommand()) // Manage controller availability r.Register(newEnableHACommand()) // Manage and control services r.Register(application.NewAddUnitCommand()) r.Register(application.NewConfigCommand()) r.Register(application.NewDefaultDeployCommand()) r.Register(application.NewExposeCommand()) r.Register(application.NewUnexposeCommand()) r.Register(application.NewServiceGetConstraintsCommand()) r.Register(application.NewServiceSetConstraintsCommand()) // Operation protection commands r.Register(block.NewDisableCommand()) r.Register(block.NewListCommand()) r.Register(block.NewEnableCommand()) // Manage storage r.Register(storage.NewAddCommand()) r.Register(storage.NewListCommand()) r.Register(storage.NewPoolCreateCommand()) r.Register(storage.NewPoolListCommand()) r.Register(storage.NewShowCommand()) // Manage spaces r.Register(space.NewAddCommand()) r.Register(space.NewListCommand()) if featureflag.Enabled(feature.PostNetCLIMVP) { r.Register(space.NewRemoveCommand()) r.Register(space.NewUpdateCommand()) r.Register(space.NewRenameCommand()) } // Manage subnets r.Register(subnet.NewAddCommand()) r.Register(subnet.NewListCommand()) if featureflag.Enabled(feature.PostNetCLIMVP) { r.Register(subnet.NewCreateCommand()) r.Register(subnet.NewRemoveCommand()) } // Manage controllers r.Register(controller.NewAddModelCommand()) r.Register(controller.NewDestroyCommand()) r.Register(controller.NewListModelsCommand()) r.Register(controller.NewKillCommand()) r.Register(controller.NewListControllersCommand()) r.Register(controller.NewRegisterCommand()) r.Register(controller.NewUnregisterCommand(jujuclient.NewFileClientStore())) r.Register(controller.NewEnableDestroyControllerCommand()) r.Register(controller.NewShowControllerCommand()) r.Register(controller.NewGetConfigCommand()) // Debug Metrics r.Register(metricsdebug.New()) r.Register(metricsdebug.NewCollectMetricsCommand()) r.Register(setmeterstatus.New()) // Manage clouds and credentials r.Register(cloud.NewUpdateCloudsCommand()) r.Register(cloud.NewListCloudsCommand()) r.Register(cloud.NewListRegionsCommand()) r.Register(cloud.NewShowCloudCommand()) r.Register(cloud.NewAddCloudCommand()) r.Register(cloud.NewRemoveCloudCommand()) r.Register(cloud.NewListCredentialsCommand()) r.Register(cloud.NewDetectCredentialsCommand()) r.Register(cloud.NewSetDefaultRegionCommand()) r.Register(cloud.NewSetDefaultCredentialCommand()) r.Register(cloud.NewAddCredentialCommand()) r.Register(cloud.NewRemoveCredentialCommand()) r.Register(cloud.NewUpdateCredentialCommand()) // Juju GUI commands. r.Register(gui.NewGUICommand()) r.Register(gui.NewUpgradeGUICommand()) // Commands registered elsewhere. for _, newCommand := range registeredCommands { command := newCommand() r.Register(command) } for _, newCommand := range registeredEnvCommands { command := newCommand() r.Register(modelcmd.Wrap(command)) } rcmd.RegisterAll(r) }
func (s *UpgradeCharmStoreResourceSuite) TestDeployStarsaySuccess(c *gc.C) { testcharms.UploadCharm(c, s.client, "trusty/starsay-1", "starsay") // let's make a fake resource file to upload resourceContent := "some-data" resourceFile := path.Join(c.MkDir(), "data.xml") err := ioutil.WriteFile(resourceFile, []byte(resourceContent), 0644) c.Assert(err, jc.ErrorIsNil) ctx, err := testing.RunCommand(c, application.NewDefaultDeployCommand(), "trusty/starsay", "--resource", "upload-resource="+resourceFile) c.Assert(err, jc.ErrorIsNil) output := testing.Stderr(ctx) expectedOutput := `Located charm "cs:trusty/starsay-1". Deploying charm "cs:trusty/starsay-1". ` c.Assert(output, gc.Equals, expectedOutput) s.assertCharmsUploaded(c, "cs:trusty/starsay-1") s.assertServicesDeployed(c, map[string]serviceInfo{ "starsay": {charm: "cs:trusty/starsay-1"}, }) _, err = s.State.Unit("starsay/0") c.Assert(err, jc.ErrorIsNil) res, err := s.State.Resources() c.Assert(err, jc.ErrorIsNil) svcres, err := res.ListResources("starsay") c.Assert(err, jc.ErrorIsNil) sort.Sort(byname(svcres.Resources)) c.Assert(svcres.Resources, gc.HasLen, 3) c.Check(svcres.Resources[2].Timestamp, gc.Not(gc.Equals), time.Time{}) svcres.Resources[2].Timestamp = time.Time{} // Note that all charm resources were uploaded by testcharms.UploadCharm // so that the charm could be published. expectedResources := []resource.Resource{{ Resource: charmresource.Resource{ Meta: charmresource.Meta{ Name: "install-resource", Type: charmresource.TypeFile, Path: "gotta-have-it.txt", Description: "get things started", }, Origin: charmresource.OriginStore, Revision: 0, Fingerprint: resourceHash("install-resource content"), Size: int64(len("install-resource content")), }, ID: "starsay/install-resource", ApplicationID: "starsay", }, { Resource: charmresource.Resource{ Meta: charmresource.Meta{ Name: "store-resource", Type: charmresource.TypeFile, Path: "filename.tgz", Description: "One line that is useful when operators need to push it.", }, Origin: charmresource.OriginStore, Revision: 0, Fingerprint: resourceHash("store-resource content"), Size: int64(len("store-resource content")), }, ID: "starsay/store-resource", ApplicationID: "starsay", }, { Resource: charmresource.Resource{ Meta: charmresource.Meta{ Name: "upload-resource", Type: charmresource.TypeFile, Path: "somename.xml", Description: "Who uses xml anymore?", }, Origin: charmresource.OriginUpload, Revision: 0, Fingerprint: resourceHash(resourceContent), Size: int64(len(resourceContent)), }, ID: "starsay/upload-resource", ApplicationID: "starsay", Username: "******", // Timestamp is checked above }} c.Check(svcres.Resources, jc.DeepEquals, expectedResources) oldCharmStoreResources := make([]charmresource.Resource, len(svcres.CharmStoreResources)) copy(oldCharmStoreResources, svcres.CharmStoreResources) sort.Sort(csbyname(oldCharmStoreResources)) testcharms.UploadCharm(c, s.client, "trusty/starsay-2", "starsay") _, err = testing.RunCommand(c, application.NewUpgradeCharmCommand(), "starsay") c.Assert(err, jc.ErrorIsNil) s.assertServicesDeployed(c, map[string]serviceInfo{ "starsay": {charm: "cs:trusty/starsay-2"}, }) res, err = s.State.Resources() c.Assert(err, jc.ErrorIsNil) svcres, err = res.ListResources("starsay") c.Assert(err, jc.ErrorIsNil) sort.Sort(byname(svcres.Resources)) c.Assert(svcres.Resources, gc.HasLen, 3) c.Check(svcres.Resources[2].Timestamp, gc.Not(gc.Equals), time.Time{}) svcres.Resources[2].Timestamp = time.Time{} // ensure that we haven't overridden the previously uploaded resource. c.Check(svcres.Resources, jc.DeepEquals, expectedResources) sort.Sort(csbyname(svcres.CharmStoreResources)) c.Check(oldCharmStoreResources, gc.DeepEquals, svcres.CharmStoreResources) }