github.com/wallyworld/juju@v0.0.0-20161013125918-6cf1bc9d917a/featuretests/api_model_test.go (about)

     1  // Copyright 2015 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package featuretests
     5  
     6  import (
     7  	"bytes"
     8  	"time"
     9  
    10  	"github.com/juju/errors"
    11  	jc "github.com/juju/testing/checkers"
    12  	"github.com/juju/version"
    13  	gc "gopkg.in/check.v1"
    14  	"gopkg.in/juju/names.v2"
    15  
    16  	"github.com/juju/juju/api"
    17  	"github.com/juju/juju/api/modelmanager"
    18  	"github.com/juju/juju/apiserver/params"
    19  	jujunames "github.com/juju/juju/juju/names"
    20  	"github.com/juju/juju/juju/testing"
    21  	"github.com/juju/juju/permission"
    22  	"github.com/juju/juju/state"
    23  	coretesting "github.com/juju/juju/testing"
    24  	"github.com/juju/juju/testing/factory"
    25  )
    26  
    27  type apiEnvironmentSuite struct {
    28  	testing.JujuConnSuite
    29  	client *api.Client
    30  }
    31  
    32  func (s *apiEnvironmentSuite) SetUpTest(c *gc.C) {
    33  	s.JujuConnSuite.SetUpTest(c)
    34  	s.client = s.APIState.Client()
    35  	c.Assert(s.client, gc.NotNil)
    36  	s.AddCleanup(func(*gc.C) {
    37  		s.client.ClientFacade.Close()
    38  	})
    39  }
    40  
    41  func (s *apiEnvironmentSuite) TestGrantModel(c *gc.C) {
    42  	username := "foo@ubuntuone"
    43  	model, err := s.State.Model()
    44  	c.Assert(err, jc.ErrorIsNil)
    45  	mm := modelmanager.NewClient(s.OpenControllerAPI(c))
    46  	defer mm.Close()
    47  	err = mm.GrantModel(username, "read", model.UUID())
    48  	c.Assert(err, jc.ErrorIsNil)
    49  
    50  	user := names.NewUserTag(username)
    51  	modelUser, err := s.State.UserAccess(user, model.ModelTag())
    52  	c.Assert(err, jc.ErrorIsNil)
    53  	c.Assert(modelUser.UserName, gc.Equals, user.Id())
    54  	lastConn, err := s.State.LastModelConnection(modelUser.UserTag)
    55  	c.Assert(err, jc.Satisfies, state.IsNeverConnectedError)
    56  	c.Assert(lastConn.IsZero(), jc.IsTrue)
    57  }
    58  
    59  func (s *apiEnvironmentSuite) TestRevokeModel(c *gc.C) {
    60  	// First share an environment with a user.
    61  	user := s.Factory.MakeModelUser(c, &factory.ModelUserParams{User: "foo@ubuntuone"})
    62  	model, err := s.State.Model()
    63  	c.Assert(err, jc.ErrorIsNil)
    64  	mm := modelmanager.NewClient(s.OpenControllerAPI(c))
    65  	defer mm.Close()
    66  
    67  	modelUser, err := s.State.UserAccess(user.UserTag, s.State.ModelTag())
    68  	c.Assert(err, jc.ErrorIsNil)
    69  	c.Assert(modelUser, gc.Not(gc.DeepEquals), permission.UserAccess{})
    70  
    71  	// Then test unsharing the environment.
    72  	err = mm.RevokeModel(user.UserName, "read", model.UUID())
    73  	c.Assert(err, jc.ErrorIsNil)
    74  
    75  	modelUser, err = s.State.UserAccess(user.UserTag, s.State.ModelTag())
    76  	c.Assert(errors.IsNotFound(err), jc.IsTrue)
    77  	c.Assert(modelUser, gc.DeepEquals, permission.UserAccess{})
    78  }
    79  
    80  func (s *apiEnvironmentSuite) TestEnvironmentUserInfo(c *gc.C) {
    81  	modelUser := s.Factory.MakeModelUser(c, &factory.ModelUserParams{User: "bobjohns@ubuntuone", DisplayName: "Bob Johns"})
    82  	mod, err := s.State.Model()
    83  	c.Assert(err, jc.ErrorIsNil)
    84  	owner, err := s.State.UserAccess(mod.Owner(), mod.ModelTag())
    85  	c.Assert(err, jc.ErrorIsNil)
    86  
    87  	obtained, err := s.client.ModelUserInfo()
    88  	c.Assert(err, jc.ErrorIsNil)
    89  	c.Assert(obtained, gc.DeepEquals, []params.ModelUserInfo{
    90  		{
    91  			UserName:       owner.UserName,
    92  			DisplayName:    owner.DisplayName,
    93  			Access:         "admin",
    94  			LastConnection: lastConnPointer(c, s.State, owner),
    95  		}, {
    96  			UserName:       "bobjohns@ubuntuone",
    97  			DisplayName:    "Bob Johns",
    98  			Access:         "admin",
    99  			LastConnection: lastConnPointer(c, s.State, modelUser),
   100  		},
   101  	})
   102  }
   103  
   104  func lastConnPointer(c *gc.C, st *state.State, modelUser permission.UserAccess) *time.Time {
   105  	lastConn, err := st.LastModelConnection(modelUser.UserTag)
   106  	if err != nil {
   107  		if state.IsNeverConnectedError(err) {
   108  			return nil
   109  		}
   110  		c.Fatal(err)
   111  	}
   112  	return &lastConn
   113  }
   114  
   115  func (s *apiEnvironmentSuite) TestUploadToolsOtherEnvironment(c *gc.C) {
   116  	// setup other environment
   117  	otherState := s.Factory.MakeModel(c, nil)
   118  	defer otherState.Close()
   119  	info := s.APIInfo(c)
   120  	info.ModelTag = otherState.ModelTag()
   121  	otherAPIState, err := api.Open(info, api.DefaultDialOpts())
   122  	c.Assert(err, jc.ErrorIsNil)
   123  	defer otherAPIState.Close()
   124  	otherClient := otherAPIState.Client()
   125  	defer otherClient.ClientFacade.Close()
   126  
   127  	newVersion := version.MustParseBinary("5.4.3-quantal-amd64")
   128  	vers := newVersion.String()
   129  
   130  	// build fake tools
   131  	tgz, checksum := coretesting.TarGz(
   132  		coretesting.NewTarFile(jujunames.Jujud, 0777, "jujud contents "+vers))
   133  
   134  	toolsList, err := otherClient.UploadTools(bytes.NewReader(tgz), newVersion)
   135  	c.Assert(err, jc.ErrorIsNil)
   136  	c.Assert(toolsList, gc.HasLen, 1)
   137  	c.Assert(toolsList[0].SHA256, gc.Equals, checksum)
   138  
   139  	toolStrg, err := otherState.ToolsStorage()
   140  	defer toolStrg.Close()
   141  	c.Assert(err, jc.ErrorIsNil)
   142  	meta, closer, err := toolStrg.Open(vers)
   143  	defer closer.Close()
   144  	c.Assert(err, jc.ErrorIsNil)
   145  	c.Assert(meta.SHA256, gc.Equals, checksum)
   146  	c.Assert(meta.Version, gc.Equals, vers)
   147  }