func (s *DeployCharmStoreSuite) TestDeployAuthorization(c *gc.C) { // Upload the two charms required to upload the bundle. testcharms.UploadCharm(c, s.client, "trusty/mysql-0", "mysql") testcharms.UploadCharm(c, s.client, "trusty/wordpress-1", "wordpress") // Run the tests. for i, test := range deployAuthorizationTests { c.Logf("test %d: %s", i, test.about) // Upload the charm or bundle under test. url := charm.MustParseURL(test.uploadURL) if url.Series == "bundle" { url, _ = testcharms.UploadBundle(c, s.client, test.uploadURL, "wordpress-simple") } else { url, _ = testcharms.UploadCharm(c, s.client, test.uploadURL, "wordpress") } // Change the ACL of the uploaded entity if required in this case. if test.readPermUser != "" { s.changeReadPerm(c, url, test.readPermUser) } ctx, err := coretesting.RunCommand(c, envcmd.Wrap(&deployCommand{}), test.deployURL, fmt.Sprintf("wordpress%d", i)) if test.expectError != "" { c.Assert(err, gc.ErrorMatches, test.expectError) continue } c.Assert(err, jc.ErrorIsNil) output := strings.Trim(coretesting.Stderr(ctx), "\n") c.Assert(output, gc.Equals, strings.TrimSpace(test.expectOutput)) } }
func (s *DeployCharmStoreSuite) TestDeployBundleSuccess(c *gc.C) { testcharms.UploadCharm(c, s.client, "trusty/mysql-42", "mysql") testcharms.UploadCharm(c, s.client, "trusty/wordpress-47", "wordpress") testcharms.UploadBundle(c, s.client, "bundle/wordpress-simple-1", "wordpress-simple") output, err := runDeployCommand(c, "bundle/wordpress-simple") c.Assert(err, jc.ErrorIsNil) expectedOutput := ` added charm cs:trusty/mysql-42 service mysql deployed (charm: cs:trusty/mysql-42) added charm cs:trusty/wordpress-47 service wordpress deployed (charm: cs:trusty/wordpress-47) related wordpress:db and mysql:server added mysql/0 unit to new machine added wordpress/0 unit to new machine deployment of bundle "cs:bundle/wordpress-simple-1" completed` c.Assert(output, gc.Equals, strings.TrimSpace(expectedOutput)) s.assertCharmsUplodaded(c, "cs:trusty/mysql-42", "cs:trusty/wordpress-47") s.assertServicesDeployed(c, map[string]serviceInfo{ "mysql": {charm: "cs:trusty/mysql-42"}, "wordpress": {charm: "cs:trusty/wordpress-47"}, }) s.assertRelationsEstablished(c, "wordpress:db mysql:server") s.assertUnitsCreated(c, map[string]string{ "mysql/0": "0", "wordpress/0": "1", }) }
func (s *DeployCharmStoreSuite) TestDeployBundleWithTermsSuccess(c *gc.C) { testcharms.UploadCharm(c, s.client, "trusty/terms1-17", "terms1") testcharms.UploadCharm(c, s.client, "trusty/terms2-42", "terms2") testcharms.UploadBundle(c, s.client, "bundle/terms-simple-1", "terms-simple") output, err := runDeployCommand(c, "bundle/terms-simple") c.Assert(err, jc.ErrorIsNil) expectedOutput := ` added charm cs:trusty/terms1-17 service terms1 deployed (charm: cs:trusty/terms1-17) added charm cs:trusty/terms2-42 service terms2 deployed (charm: cs:trusty/terms2-42) added terms1/0 unit to new machine added terms2/0 unit to new machine deployment of bundle "cs:bundle/terms-simple-1" completed` c.Assert(output, gc.Equals, strings.TrimSpace(expectedOutput)) s.assertCharmsUplodaded(c, "cs:trusty/terms1-17", "cs:trusty/terms2-42") s.assertServicesDeployed(c, map[string]serviceInfo{ "terms1": {charm: "cs:trusty/terms1-17"}, "terms2": {charm: "cs:trusty/terms2-42"}, }) s.assertUnitsCreated(c, map[string]string{ "terms1/0": "0", "terms2/0": "1", }) c.Assert(s.termsString, gc.Not(gc.Equals), "") }
func (s *BundleDeployCharmStoreSuite) TestDeployBundleStorage(c *gc.C) { testcharms.UploadCharm(c, s.client, "xenial/mysql-42", "mysql-storage") testcharms.UploadCharm(c, s.client, "xenial/wordpress-47", "wordpress") testcharms.UploadBundle(c, s.client, "bundle/wordpress-with-mysql-storage-1", "wordpress-with-mysql-storage") _, err := runDeployCommand( c, "bundle/wordpress-with-mysql-storage", "--storage", "mysql:logs=tmpfs,10G", // override logs ) c.Assert(err, jc.ErrorIsNil) s.assertCharmsUploaded(c, "cs:xenial/mysql-42", "cs:xenial/wordpress-47") s.assertApplicationsDeployed(c, map[string]serviceInfo{ "mysql": { charm: "cs:xenial/mysql-42", storage: map[string]state.StorageConstraints{ "data": state.StorageConstraints{Pool: "rootfs", Size: 50 * 1024, Count: 1}, "logs": state.StorageConstraints{Pool: "tmpfs", Size: 10 * 1024, Count: 1}, }, }, "wordpress": {charm: "cs:xenial/wordpress-47"}, }) s.assertRelationsEstablished(c, "wordpress:db mysql:server") s.assertUnitsCreated(c, map[string]string{ "mysql/0": "0", "wordpress/0": "1", }) }
func (s *DeployCharmStoreSuite) TestDeployBundleGatedCharmUnauthorized(c *gc.C) { testcharms.UploadCharm(c, s.client, "trusty/mysql-42", "mysql") url, _ := testcharms.UploadCharm(c, s.client, "trusty/wordpress-47", "wordpress") s.changeReadPerm(c, url, "who") testcharms.UploadBundle(c, s.client, "bundle/wordpress-simple-1", "wordpress-simple") _, err := runDeployCommand(c, "bundle/wordpress-simple") c.Assert(err, gc.ErrorMatches, `cannot deploy bundle: .*: unauthorized: access denied for user "client-username"`) }
func (s *DeployCharmStoreSuite) TestDeployBundleInvalidFlags(c *gc.C) { testcharms.UploadCharm(c, s.client, "trusty/mysql-42", "mysql") testcharms.UploadCharm(c, s.client, "trusty/wordpress-47", "wordpress") testcharms.UploadBundle(c, s.client, "bundle/wordpress-simple-1", "wordpress-simple") _, err := runDeployCommand(c, "bundle/wordpress-simple", "--config", "config.yaml") c.Assert(err, gc.ErrorMatches, "Flags provided but not supported when deploying a bundle: --config.") _, err = runDeployCommand(c, "bundle/wordpress-simple", "-n", "2") c.Assert(err, gc.ErrorMatches, "Flags provided but not supported when deploying a bundle: -n.") _, err = runDeployCommand(c, "bundle/wordpress-simple", "--series", "trusty", "--force") c.Assert(err, gc.ErrorMatches, "Flags provided but not supported when deploying a bundle: --force, --series.") }
func (s *DeployCharmStoreSuite) TestDeployBundleGatedCharm(c *gc.C) { testcharms.UploadCharm(c, s.client, "trusty/mysql-42", "mysql") url, _ := testcharms.UploadCharm(c, s.client, "trusty/wordpress-47", "wordpress") s.changeReadPerm(c, url, clientUserName) testcharms.UploadBundle(c, s.client, "bundle/wordpress-simple-1", "wordpress-simple") _, err := runDeployCommand(c, "bundle/wordpress-simple") c.Assert(err, jc.ErrorIsNil) s.assertCharmsUplodaded(c, "cs:trusty/mysql-42", "cs:trusty/wordpress-47") s.assertServicesDeployed(c, map[string]serviceInfo{ "mysql": {charm: "cs:trusty/mysql-42"}, "wordpress": {charm: "cs:trusty/wordpress-47"}, }) }
func (s *BundleDeployCharmStoreSuite) TestDeployBundleEndpointBindingsSpaceMissing(c *gc.C) { testcharms.UploadCharm(c, s.client, "xenial/mysql-42", "mysql") testcharms.UploadCharm(c, s.client, "xenial/wordpress-extra-bindings-47", "wordpress-extra-bindings") testcharms.UploadBundle(c, s.client, "bundle/wordpress-with-endpoint-bindings-1", "wordpress-with-endpoint-bindings") output, err := runDeployCommand(c, "bundle/wordpress-with-endpoint-bindings") c.Assert(err, gc.ErrorMatches, ""+ "cannot deploy bundle: cannot deploy application \"mysql\": "+ "cannot add application \"mysql\": unknown space \"db\" not valid") c.Assert(output, gc.Equals, ""+ `Located bundle "cs:bundle/wordpress-with-endpoint-bindings-1"`+"\n"+ `Deploying charm "cs:xenial/mysql-42"`, ) s.assertCharmsUploaded(c, "cs:xenial/mysql-42") s.assertApplicationsDeployed(c, map[string]serviceInfo{}) s.assertUnitsCreated(c, map[string]string{}) }
func (s *BundleDeployCharmStoreSuite) TestDeployBundleWithTermsSuccess(c *gc.C) { testcharms.UploadCharm(c, s.client, "xenial/terms1-17", "terms1") testcharms.UploadCharm(c, s.client, "xenial/terms2-42", "terms2") testcharms.UploadBundle(c, s.client, "bundle/terms-simple-1", "terms-simple") _, err := runDeployCommand(c, "bundle/terms-simple") c.Assert(err, jc.ErrorIsNil) s.assertCharmsUploaded(c, "cs:xenial/terms1-17", "cs:xenial/terms2-42") s.assertApplicationsDeployed(c, map[string]serviceInfo{ "terms1": {charm: "cs:xenial/terms1-17"}, "terms2": {charm: "cs:xenial/terms2-42"}, }) s.assertUnitsCreated(c, map[string]string{ "terms1/0": "0", "terms2/0": "1", }) c.Assert(s.termsString, gc.Not(gc.Equals), "") }
func (s *BundleDeployCharmStoreSuite) TestDeployBundleSuccess(c *gc.C) { testcharms.UploadCharm(c, s.client, "xenial/mysql-42", "mysql") testcharms.UploadCharm(c, s.client, "xenial/wordpress-47", "wordpress") testcharms.UploadBundle(c, s.client, "bundle/wordpress-simple-1", "wordpress-simple") _, err := runDeployCommand(c, "bundle/wordpress-simple") c.Assert(err, jc.ErrorIsNil) s.assertCharmsUploaded(c, "cs:xenial/mysql-42", "cs:xenial/wordpress-47") s.assertApplicationsDeployed(c, map[string]serviceInfo{ "mysql": {charm: "cs:xenial/mysql-42"}, "wordpress": {charm: "cs:xenial/wordpress-47"}, }) s.assertRelationsEstablished(c, "wordpress:db mysql:server") s.assertUnitsCreated(c, map[string]string{ "mysql/0": "0", "wordpress/0": "1", }) }
func (s *BundleDeployCharmStoreSuite) TestDeployBundleEndpointBindingsSuccess(c *gc.C) { _, err := s.State.AddSpace("db", "", nil, false) c.Assert(err, jc.ErrorIsNil) _, err = s.State.AddSpace("public", "", nil, false) c.Assert(err, jc.ErrorIsNil) testcharms.UploadCharm(c, s.client, "xenial/mysql-42", "mysql") testcharms.UploadCharm(c, s.client, "xenial/wordpress-extra-bindings-47", "wordpress-extra-bindings") testcharms.UploadBundle(c, s.client, "bundle/wordpress-with-endpoint-bindings-1", "wordpress-with-endpoint-bindings") _, err = runDeployCommand(c, "bundle/wordpress-with-endpoint-bindings") c.Assert(err, jc.ErrorIsNil) s.assertCharmsUploaded(c, "cs:xenial/mysql-42", "cs:xenial/wordpress-extra-bindings-47") s.assertApplicationsDeployed(c, map[string]serviceInfo{ "mysql": {charm: "cs:xenial/mysql-42"}, "wordpress-extra-bindings": {charm: "cs:xenial/wordpress-extra-bindings-47"}, }) s.assertDeployedServiceBindings(c, map[string]serviceInfo{ "mysql": { endpointBindings: map[string]string{"server": "db"}, }, "wordpress-extra-bindings": { endpointBindings: map[string]string{ "cache": "", "url": "public", "logging-dir": "", "monitoring-port": "", "db": "db", "cluster": "", "db-client": "db", "admin-api": "public", "foo-bar": "", }, }, }) s.assertRelationsEstablished(c, "wordpress-extra-bindings:cluster", "wordpress-extra-bindings:db mysql:server") s.assertUnitsCreated(c, map[string]string{ "mysql/0": "0", "wordpress-extra-bindings/0": "1", }) }
func (s *DeployCharmStoreSuite) TestDeployBundleStorage(c *gc.C) { testcharms.UploadCharm(c, s.client, "trusty/mysql-42", "mysql-storage") testcharms.UploadCharm(c, s.client, "trusty/wordpress-47", "wordpress") testcharms.UploadBundle(c, s.client, "bundle/wordpress-with-mysql-storage-1", "wordpress-with-mysql-storage") output, err := runDeployCommand( c, "bundle/wordpress-with-mysql-storage", "--storage", "mysql:logs=tmpfs,10G", // override logs ) c.Assert(err, jc.ErrorIsNil) expectedOutput := ` added charm cs:trusty/mysql-42 service mysql deployed (charm: cs:trusty/mysql-42) added charm cs:trusty/wordpress-47 service wordpress deployed (charm: cs:trusty/wordpress-47) related wordpress:db and mysql:server added mysql/0 unit to new machine added wordpress/0 unit to new machine deployment of bundle "cs:bundle/wordpress-with-mysql-storage-1" completed` c.Assert(output, gc.Equals, strings.TrimSpace(expectedOutput)) s.assertCharmsUplodaded(c, "cs:trusty/mysql-42", "cs:trusty/wordpress-47") s.assertServicesDeployed(c, map[string]serviceInfo{ "mysql": { charm: "cs:trusty/mysql-42", storage: map[string]state.StorageConstraints{ "data": state.StorageConstraints{Pool: "rootfs", Size: 50 * 1024, Count: 1}, "logs": state.StorageConstraints{Pool: "tmpfs", Size: 10 * 1024, Count: 1}, }, }, "wordpress": {charm: "cs:trusty/wordpress-47"}, }) s.assertRelationsEstablished(c, "wordpress:db mysql:server") s.assertUnitsCreated(c, map[string]string{ "mysql/0": "0", "wordpress/0": "1", }) }